我设置了一些相互依赖的 VS 项目。简单来说,想象一下这些项目:
通常,会有(例如)一个 Android 客户端,它连接到 API 服务器 (1) 并请求一些信息。然后,API 服务器将连接到 DummyBackendServer (2) 以请求这些信息,生成适当的格式并向 Android 客户端发送答案。
现在我需要为 API 服务器创建一些单元测试。我的问题是,我没有找到一种方法来告诉 VS 在运行单元测试时启动 DummyBackendServer (2)。当我第一次启动 DummyServer 时,我无法运行测试,因为菜单选项呈灰色。
那么,有没有办法告诉VS启动另一个测试所依赖的项目呢?
对于那些不想以正确方式进行单元测试而只想在同一解决方案中运行多个项目的人,这就是答案。
右键后端项目 -> 调试 -> 启动而不调试。
界面不会变灰,因此您可以开始其他项目。
右键单击开始测试 -> 运行测试
或者像平常一样运行前端并进行调试,方法是将其设置为启动项目(解决方案资源管理器中的粗体)并单击 F5 或绿色箭头“开始调试”。
分而治之!
如果测试(有些人会说这些不是单元测试,但这不是这个问题的一部分)需要启动某些服务 - 实现这一点!将它们部署到某个开发或临时环境,然后您只需配置 API 测试程序集的连接即可。
我会将解决方案分成两部分,并将其称为集成测试。如果您希望他们进行单元测试,您可以从上面的帖子中获得所需的内容。
您应该在项目中使用 IoC 容器或类似的东西,这样您就可以在运行单元测试时获得其他项目的
mock
。
Rhino.Mocks
:
MockRepository mocks = new MockRepository();
ISomeInterface robot = (ISomeInterface)mocks.CreateMock(typeof(ISomeInterface));
//If you're using C# 2.0, you may use the generic version and avoid upcasting:
ISomeInterface robot = mocks.CreateMock<ISomeInterface>();
// this method has a return type, so wrap it with Expect.Call
Expect.Call(robot.SendCommand("Wake Up")).Return("Groan");
// this method has void return type, so simply call it
robot.Poke();
//Note that the parameter values provided in these calls represent those values we
//expect our mock to be called with. Similary, the return value represents the value
//that the mock will return when this method is called.
//You may expect a method to be called multiple times:
// again, methods that return values use Expect.Call
Expect.Call(robot.SendCommand("Wake Up")).Return("Groan").Repeat.Twice();
// when no return type, any extra information about the method call
// is provided immediately after via static methods on LastCall
robot.Poke();
LastCall.On(robot).Repeat.Twice();
mocks.ReplayAll();
theButler.GetRobotReady();
mocks.VerifyAll();
只需在另一个 Visual Studio 实例中打开相同的项目(解决方案)。 (当VS打开时,按shift并再次打开Visual Studio)