Mocked方法返回null

时间:2011-07-07 07:29:38

标签: .net silverlight unit-testing mocking moq

我的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。 我做错了什么?

2 个答案:

答案 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);