如何对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") });
    }

我已经嘲笑过:

        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

你怎么嘲笑他们?

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

MSDN说 AntiForgery.Validate

验证来自HTML表单字段的输入数据来自提交数据的用户。

带两个字符串参数签名返回void

您的模拟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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对无参数的void方法进行单元测试

如何对该doFilter()方法进行单元测试?

如何对带有枚举参数的方法进行单元测试?

如何将@WebMvcTest用于单元测试POST方法?

如何对反应组件的方法进行单元测试?

您如何对私有方法进行单元测试?

如何对执行异步方法的RelayCommand进行单元测试?

如何对依赖于springBoot applicationContext的单元测试方法进行单元测试?

如何对空方法进行单元测试

如何对与System(或Android)类交互的方法进行单元测试

如何对React Component的shouldComponentUpdate方法进行单元测试

如何对__init __()函数中调用的方法进行单元测试?

如何在python中对POST方法进行单元测试?

如何对使用Part类型参数的方法进行单元测试?

如何使用Mockito模拟静态方法以进行单元测试

角度单元测试:如何对.map()进行单元测试?

如何对依赖服务的组件的方法进行单元测试?

如何对MatDialog(角材料)进行单元测试的正确方法?

如何对返回Promise的Async方法进行单元测试

我将如何对该方法进行单元测试?

如何对字符串扩展方法进行单元测试

如何对导致操作的方法进行单元测试

如何在模拟方法中对函数进行单元测试

如何对发布方法进行泽西单元测试

如何对以下方法进行单元测试

如何使用 JustMock lite 对删除方法进行单元测试

如何对返回 Action<AuthenticationOptions> 的方法进行单元测试?

如何对时间相关的方法进行单元测试?

如何对调用 void 方法的方法进行单元测试?