在过去,我只使用了Rhino Mocks,典型的严格模拟.我正在与Moq合作开展一个项目,我想知道正确的用法.
假设我有一个方法Bar的对象Foo,它在对象Buzz上调用Bizz方法.
在我的测试中,我想验证Bizz是否被调用,因此我觉得有两种可能的选择:
用严格的模拟
var mockBuzz= new Mock<IBuzz>(MockBehavior.Strict);
mockBuzz.Setup(x => x.Bizz()); //test will fail if Bizz method not called
foo.Buzz = mockBuzz
foo.Bar();
mockBuzz.VerifyAll();
Run Code Online (Sandbox Code Playgroud)
随着一个松散的模拟
var mockBuzz= new Mock<IBuzz>();
foo.Buzz = mockBuzz
foo.Bar();
mockBuzz.Verify(x => x.Bizz()) //test will fail if Bizz method not called
Run Code Online (Sandbox Code Playgroud)
有这样做的标准或正常方式吗?
根据此处定义的 Moq 快速入门的最后一部分,我尝试配置以下模拟,以便将表单值传递给测试中的控制器方法:
var formCollection = new FormCollection(
new System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues>()
{
{"mAction", "someAction" },
{"mRefId", "0" }
});
var controllerContext = Mock.Of<ControllerContext>(ctx =>
ctx.HttpContext.Request.Form == formCollection);
controller.ControllerContext = controllerContext;
Run Code Online (Sandbox Code Playgroud)
但是,当运行测试时,它失败Mock.Of<>
并出现以下错误:
System.NotSupportedException:不支持的表达式:mock => mock.HttpContext
不可重写的成员(此处:ActionContext.get_HttpContext)不得在设置/验证表达式中使用。
我缺少什么?我是否按照快速入门文档中定义的示例执行相同的操作?