加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

单元测试 – 自动混合和WebApi控制器

发布时间:2020-12-16 06:22:33 所属栏目:asp.Net 来源:网络整理
导读:我正在使用AutoFixture来测试我的控制器以获取WebApi站点.我正在使用Moq的AutoData功能,如 Ploeh’s blog所述. 我的控制器在构造函数中使用IDepartmentManager.这是我的测试: [Theory,AutoMoqData]public void GetCallsManagerCorrectly( [Frozen]MockIDepa
我正在使用AutoFixture来测试我的控制器以获取WebApi站点.我正在使用Moq的AutoData功能,如 Ploeh’s blog所述.

我的控制器在构造函数中使用IDepartmentManager.这是我的测试:

[Theory,AutoMoqData]
public void GetCallsManagerCorrectly(
    [Frozen]Mock<IDepartmentManager> departmentManagerMock,DepartmentsController sut)
{
    // Fixture setup
    // Exercise system
    sut.Get();
    // Verify outcome
    departmentManagerMock.Verify(d => d.GetAllDepartments(),Times.Exactly(1));
    // Teardown
}

当我运行此测试时,它失败并出现以下情况:

GetCallsManagerCorrectly has failed:
System.InvalidOperationException : An exception was thrown while
getting data for theory
Provision.Tests.WebApiControllerTests.DepartmentControllerTests.GetCallsManagerCorrectly:
System.Reflection.TargetInvocationException: Exception has been thrown
by the target of an invocation. —> System.ArgumentException: Only
‘http’ and ‘https’ schemes are allowed. Parameter name: value at
System.Net.Http.HttpRequestMessage.set_RequestUri(Uri value)

首先,这仍然是编写这些测试的有效和推荐方法吗?我喜欢它制作一切的小.

其次,我该怎么做才能解决这个问题?如果我将测试更改为:

[Theory,AutoMoqData]
public void GetCallsManagerCorrectly(
    [Frozen]Mock<IDepartmentManager> departmentManagerMock)
{
    // Fixture setup
    DepartmentsController sut =
        new DepartmentsController(departmentManagerMock.Object);
    // Exercise system
    sut.Get();
    // Verify outcome
    departmentManagerMock.Verify(d => d.GetAllDepartments(),Times.Exactly(1));
    // Teardown
}

它通过,但后来我失去了自动构建控制器的能力,如果我向构造函数添加参数仍然可以.

解决方法

这绝对是使用AutoFixture编写测试的推荐方法.这个问题很容易解决.

我不建议实现博客文章中描述的[AutoMoqData]属性,而是建议创建一个稍微不同的属性和自定义 – 一个基本上将作为整个单元测试项目的一组约定的集合.我总是这样做,而且我总是竭尽全力为单个单元测试项目只有一套约定.一组约定可以帮助我保持测试(和SUTs)的一致性.

public class AutoMyWebApiDataAttribute : AutoDataAttribute
{
    public AutoMyWebApiDataAttribute()
        : base(new Fixture().Customize(new MyWebApiCustomization()))
    {
    }
}

MyWebApiCustomization可以像这样定义:

public class MyWebApiCustomization : CompositeCustomization
{
    public MyWebApiCustomization()
        : base(
            new HttpSchemeCustomization(),new AutoMoqCustomization(),)
    {
    }

    private class HttpSchemeCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Inject(new UriScheme("http"));
        }
    }
}

注意额外的HttpSchemeCustomization类 – 应该这样做.

请注意0??7001.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读