我目前正在使用Moq框架编写单元测试和模拟依赖项.在这样做的过程中,我创建了一个Mock,如下所示:
Mock<ITraceProvider> traceProviderMock = new Mock<ITraceProvider>();
traceProviderMock.Setup(x => x.GetTraceContext(It.IsAny<string>())).Returns("test");
ITraceProvider traceObj = traceProviderMock.Object;
Run Code Online (Sandbox Code Playgroud)
但是后来我想稍微修改模拟的行为,所以我Setup再次调用Mock对象:
traceProviderMock.Setup(x => x.GetTracer(It.IsAny<string>())).Returns("tracer");
Run Code Online (Sandbox Code Playgroud)
现在没有traceProviderMock.Object再次调用,这个新的模拟行为会反映出来traceObj吗?这就是我想要的情况.
这肯定适用于该Verify()方法,但似乎不适用于该Setup方法.
我想这样做的原因是因为我使用模拟依赖项在Test Setup方法中构建了一个完整的依赖图.我只想更改我的特定测试的一个模拟依赖项的行为.后续测试也会将自己的特化应用于模拟的依赖项.
我已经完成了Karl Shiffet 的'InTheBox'WPF培训,并发现它是学习WPF的绝佳资源.它确实提出的一件事是使用依赖注入和Unity容器.以下是为我提出一些问题的代码部分:
public partial class App : Application {
protected override void OnStartup(StartupEventArgs e) {
IUnityContainer container = new UnityContainer();
container.RegisterType<IDialogService, ModalDialogService>(
new ContainerControlledLifetimeManager());
container.RegisterType<IEventRepository, EventRepository>(
new ContainerControlledLifetimeManager());
MainWindow window = container.Resolve<MainWindow>();
window.DataContext = container.Resolve<MainWindowViewModel>();
window.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
依赖项正在注册到UnityContainer中,然后由UnityContainer注入到MainWindowViewModel中.我的问题是为什么要使用容器?为什么不使用下面的代码来实现与依赖注入相同的事情:
protected override void OnStartup(StartupEventArgs e)
{
IDialogService dialogService = new ModalDialogService();
IEventRepository eventRepository = new EventRepository();
MainWindow window = new MainWindow();
window.DataContext =
new MainWindowViewModel(eventRepository, dialogService);
window.Show();
}
Run Code Online (Sandbox Code Playgroud)
我仍然从组合根注入构造函数中的依赖项,所以我认为在这种情况下使用UnityContainer没有任何好处.
我很欣赏它显然存在是有原因但有人可以解释在这种情况下它是否添加了什么?另外,还有另一种情况,使用像这样的容器真的是一个明智的选择吗?