我在测试发布方法时遇到问题。在那种方法中,AntiForgeryToken被检查了,我不知道该如何模拟它。除此之外,一切正常。
这是我要测试的方法:
[HttpPost]
//[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="Id,Name,Manufacturer,CatalogNo")] Device device)
{
ValidateRequestHeader(Request);
if (String.IsNullOrWhiteSpace(device.Name)||String.IsNullOrWhiteSpace(device.Manufacturer)||String.IsNullOrWhiteSpace(device.CatalogNo))
{
ModelState.AddModelError("", "Niepoprawne dane");
return PartialView(device);
}
unitOfWork.deviceRepository.Insert(device);
unitOfWork.Save();
return Json(new { ok = true, newurl = Url.Action("Index") });
}
我已经嘲笑过:
private IUnitOfWork fakeRepo;
DeviceController DC;
[TestInitialize]
public void Initialize()
{
Mock<IUnitOfWork> mock = new Mock<IUnitOfWork>();
mock.Setup(m => m.deviceRepository.Get(
It.IsAny<List<Expression<Func<Device, bool>>>>(),
It.IsAny<Func<IQueryable<Device>, IOrderedQueryable<Device>>>(),
null))
.Returns(new[] { new Device { Id = 1, Manufacturer = "a", Name = "b", CatalogNo = "x" } });
mock.Setup(m => m.deviceRepository.Get()).Returns(new[] { new Device { Id = 1, Manufacturer = "a", Name = "b", CatalogNo = "z" } });
fakeRepo = mock.Object;
DC = new DeviceController(fakeRepo);
}
但是我不知道如何在AntiforgeryToken
这里代码进行方法测试:
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();
}
}
AntiForgery.Validate(cookieToken, formToken);
}
我无法评论此呼叫测试的目的,但是这种解决方案似乎很难看。
您可以提出任何建议吗?
看来您需要嘲笑HttpRequestBase
和AntiForgery
。
你怎么嘲笑他们?
您可以将它们包装在自己的界面中,以显示您需要或在不久的将来可能需要的行为。在生产代码中,您将提供真正的.NET实现,在测试中,将提供模拟。
MSDN说 AntiForgery.Validate
验证来自HTML表单字段的输入数据来自提交数据的用户。
您的模拟IAntiForgeryValidator
将有一个Validate(string, string)
也返回void的方法。
public interface IAntiForgeryValidator
{
void Validate(string cookieToken, string formToken);
}
public class AntiForgeryValidator : IAntiForgeryValidator
{
public void Validate(string cookieToken, string formToken)
{
AntiForgery.Validate(cookieToken, formToken);
}
}
您可以对无效方法使用回调,并验证它们是否被调用了正确的次数:
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());
您还有另一个选择(作弊),那就是打入ValidateRequestHeader()
in的电话Create()
。这将使您能够测试其余代码,但是不建议您这样做,因为如果不对ValidateRequestHeader()
方法进行测试,那么真实代码可能会在生产代码中引起麻烦。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句