.net mock方法返回null
我在Silverlight项目中有一个简单的测试方法:.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
[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那样调用它,那么结果是一样的。