预期在模拟上调用一次,但没有执行任何调用

本文关键字:调用 一次 任何 执行 模拟 | 更新日期: 2023-09-27 17:50:31

我试着像下面这样模拟函数:

AntiForgeryValidator a = new AntiForgeryValidator();
public void ValidateRequestHeader(HttpRequestBase request) 
{
    string cookieToken = "";
    string formToken = "";
    if (request.Headers["RequestVerificationToken"] != null)
    {
        string[] tokens = request.Headers["RequestVerificationToken"].Split(':');
        if (tokens.Length == 2)
        {
            cookieToken = tokens[0].Trim();
            formToken = tokens[1].Trim();
        }
    }
    a.Validate(cookieToken, formToken);
    //AntiForgery.Validate(cookieToken, formToken);
}

所以我创建了interface:

public interface IAntiForgeryValidator
{
    //void ValidateRequestHeader(HttpRequestBase request);
    void Validate(string cookieToken, string formToken);
}
public class AntiForgeryValidator : IAntiForgeryValidator
{
    public void Validate(string cookieToken, string formToken)
    {
        AntiForgery.Validate(cookieToken, formToken);
    }
}

并向测试项目添加新代码:嘲弄Http请求:

Mock<HttpRequestBase> Request = new Mock<HttpRequestBase>();
Request.SetupGet(x => x.Headers).Returns(new System.Net.WebHeaderCollection{
    {"RequestVerificationToken", "RequestVerificationToken"}
});

和模拟验证方法:

Mock<IAntiForgeryValidator> antiForgeryMock = new Mock<IAntiForgeryValidator>();
antiForgeryMock.Setup(m => m.Validate(
    It.IsAny<string>(),
    It.IsAny<string>()))
    .Callback((string cookieToken, string formToken) =>
        {
            // call back
        });
antiForgeryMock.Verify(m => m.Validate(
        It.IsAny<string>(),
        It.IsAny<string>()), Times.Once());

这是我设法使用本页上找到的答案创建的所有代码。但我还是会像题目一样出错。我想这都是由这几行引起的:

.Callback((string cookieToken, string formToken) =>
        {
            // call back
        });

但是我不知道我应该在那里放什么。阅读Moq文档也没有帮助。

@update:尝试这样做,比如创建fakeRepository

private IAntiForgeryValidator fakeValidation;
fakeValidation = antiForgeryMock.Object;
当我试图触发测试时

函数:

[TestMethod]
public void EditPost()
{
    var data = default(Device);
    var result = DC.Edit(data);
    Assert.IsNotNull(result);
}

@Update二:新增代码:

DC.ControllerContext = new ControllerContext(context.Object,new RouteData(),DC);

现在,如果我注释出Veryfy代码工作,并传递给控制器。但仍不能正常工作未注释

预期在模拟上调用一次,但没有执行任何调用

您必须在运行测试操作之后放置antiForgeryMock.Verify()。测试通常是这样的:

// arrange
var myMock = new Mock<MyInterface>();
myMock.Setup(...);
var mySut = new Sut(myMock.Object);
// act
mySut.DoSomething()
//assert
myMock.Verify(...);

正如在评论中提到的,您不需要为您的测试安装程序,因此您将跳过该部分。