首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArgumentNullException在AutoFixture AutoDataAttribute的单元测试中

ArgumentNullException在AutoFixture AutoDataAttribute的单元测试中
EN

Stack Overflow用户
提问于 2017-06-06 02:19:12
回答 1查看 1.5K关注 0票数 1

我从一个ApiControllerConventions中为与此相关的问题编写了一个单元测试,我编写了一个AutoMoqApiControllerDataAttribute来在xUnit.net中集成这个ICustomization

代码语言:javascript
复制
public class AutoMoqApiControllerDataAttribute : AutoDataAttribute
{
    public AutoMoqApiControllerDataAttribute() : this(new Fixture())
    {
    }

    public AutoMoqApiControllerDataAttribute(IFixture fixture) : base(
        fixture.Customize(new ApiControllerConventions()))
    {
    }
}

我试着为这个属性编写一个单元测试,如下所示:

代码语言:javascript
复制
public class AutoMoqDataAttribute : AutoDataAttribute
{
    public AutoMoqDataAttribute() : this(new Fixture())
    {
    }

    public AutoMoqDataAttribute(IFixture fixture) : 
        base(fixture.Customize(new AutoMoqCustomization()))
    {
    }
}

[Theory, AutoMoqData]
public void AutoMoqApiControllerDataAttribute_ContainsCorrectCustomization(
    Mock<IFixture> mockFixture)
{
    // Arrange
    mockFixture.Setup(f => f.Customize(It.IsAny<ApiControllerConventions>())).Verifiable();

    // Act
    var sut = new AutoMoqApiControllerDataAttribute(mockFixture.Object);

    // Assert
    mockFixture.Verify(f => f.Customize(It.IsAny<ApiControllerConventions>()), Times.Once);
}

如果AutoDataAttribute异常,这将失败。

System.ArgumentNullException值不能为空。参数名称: Ploeh.AutoFixture.Xunit2.AutoDataAttribute..ctor(IFixture工装夹具)

我认为这与我对AutoMoqDataAttribute的使用有关,所以我回到了一个普通的Fact,同样的例外:

代码语言:javascript
复制
[Fact]
public void AutoMoqApiControllerDataAttribute_ContainsCorrectCustomization()
{
    // Arrange
    var mockFixture = new Mock<IFixture>();
    mockFixture.Setup(f => f.Customize(It.IsAny<ApiControllerConventions>())).Verifiable();

    // Act
    var sut = new AutoMoqApiControllerDataAttribute(mockFixture.Object);

    // Assert
    mockFixture.Verify(f => f.Customize(It.IsAny<ApiControllerConventions>()), Times.Once);
}

为什么我要得到例外?显然,我已经对IFixture进行了模拟,而且它肯定不是空的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-06 07:58:49

当您得到异常时,查看调用堆栈总是一个好主意。异常不是在AutoMoqApiControllerDataAttribute中引发的,而是在AutoDataAttribute中引发的。

代码语言:javascript
复制
System.ArgumentNullException : Value cannot be null.
Parameter name: fixture
    at Ploeh.AutoFixture.Xunit2.AutoDataAttribute..ctor(IFixture fixture)
    AutoMoqApiControllerDataAttribute.cs(12,0): at _44380395.AutoMoqApiControllerDataAttribute..ctor(IFixture fixture)
    Tests.cs(22,0): at _44380395.Tests.AutoMoqApiControllerDataAttribute_ContainsCorrectCustomization()

虽然fixture在传递给AutoMoqApiControllerDataAttribute时不是null,但是当它被传递给base(IFixture)时,它就是null

为什么?

考虑对base的调用

代码语言:javascript
复制
base(fixture.Customize(new ApiControllerConventions()))

将哪个值传递给base

不是fixture,而是调用fixture.Customize的返回值。

测试不会为此方法调用设置返回值,因此Moq默认为该类型的默认值。因为IFixture是一个引用类型,这意味着null,然后将null值传递给base

通过在测试中配置带有返回值的mockFixture,您可以轻松地解决这个问题:

代码语言:javascript
复制
[Fact]
public void AutoMoqApiControllerDataAttribute_ContainsCorrectCustomization()
{
    // Arrange
    var mockFixture = new Mock<IFixture>();
    mockFixture
        .Setup(f => f.Customize(It.IsAny<ApiControllerConventions>()))
        .Returns(mockFixture.Object)
        .Verifiable();

    // Act
    var sut = new AutoMoqApiControllerDataAttribute(mockFixture.Object);

    // Assert
    mockFixture.Verify(
        f => f.Customize(It.IsAny<ApiControllerConventions>()),
        Times.Once());
}

现在测试通过了我的复制品。

这不是AutoFixture特有的问题。你可以用任何Fluent接口复制它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44380395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档