假设我有一个这样的方法:
public void ShowDialog()
{
TestViewModel vm = new TestViewModel();
_windowManager.ShowDialog(vm);
DialogResultTest = vm.CoolText;
}现在我想写一个测试。在该测试中,我想将一个准备好的TestViewModel注入到ShowDialog(vm)方法中。我的代码如下所示:
[Test]
public void TestShowDialog()
{
TestViewModel mockVM = new TestViewModel();
mockVM.CoolText = "test";
Mock<IWindowManager> wmMock = new Mock<IWindowManager>();
wmMockSetup(w => w.ShowDialog(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<IDictionary<string, object>>()))
.Returns(true)
.Callback<object, object, IDictionary<string, object>>((vm, obj, dic) =>
{
vm = mockVM;
});
MainViewModel mainVM = new MainViewModel(wmMock.Object);
mainVM.ShowDialog();
Assert.That(mainVM.DialogResultText, Is.EqualTo("test");
}问题是,我在测试中设置的CoolText在实际的_windowManager.ShowDialog(vm)调用之后就消失了(DialogResultText为空)。看起来好像mockVM只用于_windowManager.ShowDialog(vm)的实际调用,但之后被替换为原始的vm。
有没有办法解决这个问题?
发布于 2018-01-08 21:38:33
您在测试的方法中手动实例化TestViewModel,因此没有简单的方法可以在测试期间操纵它的行为。您必须能够将它作为显式依赖项注入到目标类中,就像处理IWindowManager一样
另一种方法是使用回调来更新实际视图模型的属性,该视图模型在被模拟的成员被调用时作为参数传入。
//Arrange
var expected = "test";
var wmMock = new Mock<IWindowManager>();
wmMock.Setup(w =>
w.ShowDialog(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<IDictionary<string, object>>()))
.Returns(true)
.Callback<object, object, IDictionary<string, object>>((obj1, obj2, dic) => {
var vm = obj1 as TestViewModel;
if(vm ! = null)
vm.CoolText = expected;
});
var mainVM = new MainViewModel(wmMock.Object);
//Act
mainVM.ShowDialog();
//Assert
Assert.That(mainVM.DialogResultText, Is.EqualTo(expected);https://stackoverflow.com/questions/48148948
复制相似问题