gpt4 book ai didi

c# - 如何对 POST 方法进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:36 24 4
gpt4 key购买 nike

我在测试 post 方法时遇到问题。在该方法中,检查了 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") });
}

我已经 mock 过:

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

我不能评论这个调用测试的目的,但这个解决方案看起来有点难看。

您可以提出任何修改建议吗?

最佳答案

看起来您需要模拟 HttpRequestBaseAntiForgery

How do you mock them?

您将它们包装在您自己的界面中,以公开您需要或在不久的将来可能需要的行为。在您的生产代码中,您提供真正的 .NET 实现,在您的测试中,您的模拟。

MSDN 说 AntiForgery.Validate

Validates that input data from an HTML form field comes from the user who submitted the data.

signature that takes two string arguments返回 void

您的模拟 IAntiForgeryValidator 将有一个同样返回 void 的 Validate(string, string) 方法。

public interface IAntiForgeryValidator
{
void Validate(string cookieToken, string formToken);
}

public class AntiForgeryValidator : IAntiForgeryValidator
{
public void Validate(string cookieToken, string formToken)
{
AntiForgery.Validate(cookieToken, formToken);
}
}

您可以对 void 方法使用回调并验证它们被调用了正确的次数:

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

您还有另一种选择(作弊),即在 Create() 中对 ValidateRequestHeader() 的调用 stub 。这将使您能够测试其余代码,但不推荐这样做,因为如果您不测试该方法,真正的 ValidateRequestHeader() 可能会在您的生产代码中造成问题。

关于c# - 如何对 POST 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22399570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com