我如何使用Moq和检查只是一部分对象传递到一个函数

本文关键字:函数 一个 对象 Moq 何使用 检查 一部分 | 更新日期: 2023-09-27 17:54:38

我试图将单元测试添加到我拥有的身份验证类。基本上它所做的是,我调用Login,我期望它会返回true作为副作用,它会添加一个cookie。

这是我到目前为止的单元测试:

var mock=new Mock<IServerContext>(); //AddCookie method is within IServerContext
FSCAuth.Config.Server=mock; //set authentication to use mocked interface
mock.Setup(x=>x.AddCookie(new HttpCookie().Name=="??")); //question here
FSCAuth.Login("foo", "bar", false);
mock.VerifyAll();

我的问题是如何检查传入AddCookie参数?基本上,我要做的就是像

这样的东西
bool AddCookieVerify(HttpCookie cookie)
{
    return cookie.Name=="foobar"
}

,如果我的验证函数返回false,则抛出错误。我不明白在Moq中如何表达这个操作。

我该怎么做?

我如何使用Moq和检查只是一部分对象传递到一个函数

Moq包含It静态类,允许您指定期望的参数类型。例如,代替占位符行

mock.Setup(x => x.AddCookie(new HttpCookie().Name == "??"));

你可以做

mock.Setup(x => x.AddCookie(It.Is<HttpCookie>(cookie => cookie.Name == "Whatever")));

除非传递的值满足表达式,否则验证将失败

此外,您可能会考虑从Setup()后面跟着VerifyAll()切换到事后只使用Verify()的东西,例如:

var mock = new Mock<IServerContext>(); // AddCookie method is within IServerContext
FSCAuth.Config.Server = mock.Object; //set authentication to use mocked interface
FSCAuth.Login("foo", "bar", false);
mock.Verify(x => x.AddCookie(It.Is<HttpCookie>(cookie => cookie.Name == "Whatever")), Times.Once());

这避免了您提前显式设置期望的需要,并将其简化为额外的一行代码。

下面您将AddCookie设置为期望任何HttpCookie实例将Name属性设置为特定值。

var mock=new Mock<IServerContext>(); //AddCookie method is within IServerContext
FSCAuth.Config.Server = mock.Object; //set authentication to use mocked interface
mock.Setup(x => x.AddCookie(It.Is<HttpCookie>(h => h.Name == "foobar"))); //question here
FSCAuth.Login("foo", "bar", false);
mock.VerifyAll();

还要注意,当设置FSCAuth.Config.Server时,必须使用MockedInstance.Object .