我的Silverlight项目中有一个简单的测试方法:
[TestMethod]
[Tag("User")]
public void ViewModel_NewUserAdded_DefaultCulturesLoaded()
{
//setup
Mock<INameService> mockNameService = new Mock<INameService>();
MainViewModel viewModel = new MainViewModel();
mockNameService
.Setup(m => m.DefaultCultures(It.IsAny<Action<LoadOperation<kk_mp_name>>>()))
.Returns(new Mock<OperationBase>(null).Object);
viewModel.ContextName = mockNameService.Object;
//action
Messenger.Default.Send(-1, "New User Added");
//verify
mockNameService.Verify(
(mo) => mo.DefaultCultures(It.IsAny<Action<LoadOperation<kk_mp_name>>>()),
Times.Exactly(1));
}
DefaultCultures方法总是返回null而不是new mock-object。 我做错了什么?
答案 0 :(得分:0)
根据您的评论,它看起来像是
var mockNameService = new Mock<INameService>(MockBehavior.Strict);
没有多大帮助。
所以我的下一个问题就是问你为什么要在这里传递Null。
new Mock<OperationBase>(null).Object
你可以发布OperationBase的代码吗?
答案 1 :(得分:0)
Messenger.Default.Send
使用您在viewModel.ContextName
上设置的模拟对象吗?如果您单步执行代码到您希望调用DefaultCultures
的位置,则可以检查ContextName
的具体类型以确保它是模拟实例。
我还发现在模拟设置上添加.Callback
很有帮助,可以在其上设置断点并确保调用该方法:
MainViewModel viewModel = new MainViewModel();
mockNameService
.Setup(m => m.DefaultCultures(It.IsAny<Action<LoadOperation<kk_mp_name>>>()))
.Callback((Action<LoadOperation<kk_mp_name>> a) =>
{
; // Set breakpoint here
})
.Returns(new Mock<OperationBase>(null).Object);