我试图模仿下面的功能:
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
代码可以正常工作并传递给控制器。但仍然没有工作未注释
答案 0 :(得分:0)
您必须在运行测试操作后放入antiForgeryMock.Verify()。测试通常如下所示:
// arrange
var myMock = new Mock<MyInterface>();
myMock.Setup(...);
var mySut = new Sut(myMock.Object);
// act
mySut.DoSomething()
//assert
myMock.Verify(...);
如评论中所述,您不需要为测试设置,因此您将跳过该部分。