首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caliburn.Micro WindowManager的模拟rootView

Caliburn.Micro WindowManager的模拟rootView
EN

Stack Overflow用户
提问于 2018-01-08 19:01:51
回答 1查看 109关注 0票数 1

假设我有一个这样的方法:

代码语言:javascript
复制
public void ShowDialog()
{
  TestViewModel vm = new TestViewModel();
  _windowManager.ShowDialog(vm);
  DialogResultTest = vm.CoolText;
}

现在我想写一个测试。在该测试中,我想将一个准备好的TestViewModel注入到ShowDialog(vm)方法中。我的代码如下所示:

代码语言:javascript
复制
[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

有没有办法解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-08 21:38:33

您在测试的方法中手动实例化TestViewModel,因此没有简单的方法可以在测试期间操纵它的行为。您必须能够将它作为显式依赖项注入到目标类中,就像处理IWindowManager一样

另一种方法是使用回调来更新实际视图模型的属性,该视图模型在被模拟的成员被调用时作为参数传入。

代码语言:javascript
复制
//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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48148948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档