模拟一次的预期调用,但是0次没有执行调用

时间:2014-03-17 08:10:41

标签: c# asp.net-mvc unit-testing moq

我试图模仿下面的功能:

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);
}

所以我创建了界面:

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 two: 添加了新代码:

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

现在,如果我注释Veryfy代码可以正常工作并传递给控制器​​。但仍然没有工作未注释

1 个答案:

答案 0 :(得分:0)

您必须在运行测试操作后放入antiForgeryMock.Verify()。测试通常如下所示:

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

// act
mySut.DoSomething()

//assert
myMock.Verify(...);

如评论中所述,您不需要为测试设置,因此您将跳过该部分。