我从一个ApiControllerConventions中为与此相关的问题编写了一个单元测试,我编写了一个AutoMoqApiControllerDataAttribute来在xUnit.net中集成这个ICustomization。
public class AutoMoqApiControllerDataAttribute : AutoDataAttribute
{
public AutoMoqApiControllerDataAttribute() : this(new Fixture())
{
}
public AutoMoqApiControllerDataAttribute(IFixture fixture) : base(
fixture.Customize(new ApiControllerConventions()))
{
}
}我试着为这个属性编写一个单元测试,如下所示:
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,同样的例外:
[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进行了模拟,而且它肯定不是空的。
发布于 2017-06-06 07:58:49
当您得到异常时,查看调用堆栈总是一个好主意。异常不是在AutoMoqApiControllerDataAttribute中引发的,而是在AutoDataAttribute中引发的。
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的调用
base(fixture.Customize(new ApiControllerConventions()))将哪个值传递给base
不是fixture,而是调用fixture.Customize的返回值。
测试不会为此方法调用设置返回值,因此Moq默认为该类型的默认值。因为IFixture是一个引用类型,这意味着null,然后将null值传递给base。
通过在测试中配置带有返回值的mockFixture,您可以轻松地解决这个问题:
[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接口复制它。
https://stackoverflow.com/questions/44380395
复制相似问题