预期在模拟上调用一次,但没有执行任何调用
本文关键字:调用 一次 任何 执行 模拟 | 更新日期: 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(...);
正如在评论中提到的,您不需要为您的测试安装程序,因此您将跳过该部分。