Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net mock方法返回null_.net_Silverlight_Unit Testing_Mocking_Moq - Fatal编程技术网

.net mock方法返回null

.net mock方法返回null,.net,silverlight,unit-testing,mocking,moq,.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 MainViewM

我在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));
}
[TestMethod]
[标签(“用户”)]
public void ViewModel_NewUserAdded_defaultculturesloadded()
{
//设置
Mock mockNameService=new Mock();
MainViewModel viewModel=新的MainViewModel();
模拟名称服务
.Setup(m=>m.DefaultCultures(It.IsAny()))
.Returns(新的Mock(null).Object);
viewModel.ContextName=mockNameService.Object;
//行动
senger.Default.Send(-1,“添加了新用户”);
//核实
mockNameService.Verify(
(mo)=>mo.DefaultCultures(It.IsAny()),
正是(1));
}
DefaultCultures方法总是返回null而不是新的模拟对象。
我做错了什么?

从你的评论来看

var mockNameService = new Mock<INameService>(MockBehavior.Strict);
var mockNameService=newmock(MockBehavior.Strict);
没什么帮助

所以我的下一个问题是问为什么在这里传递Null

new Mock<OperationBase>(null).Object
新建模拟(空)。对象

你能发布OperationBase的代码吗

Messenger.Default。使用在
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);
MainViewModel viewModel=新的MainViewModel();
模拟名称服务
.Setup(m=>m.DefaultCultures(It.IsAny()))
.回调((操作a)=>
{
;//在此处设置断点
})
.Returns(新的Mock(null).Object);

如果调用未设置期望值,模拟将返回默认值(例如null)。。因此,您是否可以检查调用是否按预期进行-例如,参数是否不同,即是否与约束不匹配。接口中的方法签名为:
OperationBase DefaultCultures(操作回调)
所以它与:
it.IsAny()
太匹配了。只是你不能做别的…=试着把它变成一个严格的嘲弄。。您应该得到更好的错误描述。因为如果调用没有明确的预期,它将抛出异常而不是返回null。查看moq文件,了解如何使其成为严格的模拟。不,这没有帮助。创建的模拟没有错误,但仍然返回null而不是object。
OperationBase
System.ServiceModel.DomainServices.Client
命名空间中的一个简单抽象类。此处null是OperationBase的构造函数参数。如果我在debug(通过debug Immediate或Quick Watch)中调用
new Mock(null).Object
,那么我将得到实际的OperationBase Mock实例,但在运行代码时我没有。从这里我猜安装程序不能正常工作…如果我像
newmock(MockBehavior.Strict,null).Object那样调用它,那么结果是一样的。