此测试是否正确使用AutoFixture和Moq?它是尽可能简明扼要地写的吗?正如预期的那样,测试失败,并在写完正确的实现后通过。
[Fact]
public void CustomerPropertyIsCorrect()
{
var fixture = new AutoMoqFixture();
var expected = fixture.Create<CardHolderCustomer>();
var builderMock = fixture
.Freeze<Mock<ICustomerAdapter>>()
.Setup(x => x.BuildCustomer()).Returns(expected);
var sut = fixture.Create<CardHolderViewModel>();
var actual = sut.Customer;
Assert.Equal(expected, actual);
}
答案 0 :(得分:16)
看起来不错!但是,您也可以使用xUnit.net declaratively extension 。
假设测试中使用的类型定义为:
public class CardHolderCustomer
{
}
public interface ICustomerAdapter
{
CardHolderCustomer BuildCustomer();
}
public class CardHolderViewModel
{
private readonly ICustomerAdapter adapter;
public CardHolderViewModel(ICustomerAdapter adapter)
{
if (adapter == null)
throw new ArgumentNullException("adapter");
this.adapter = adapter;
}
public CardHolderCustomer Customer
{
get
{
return this.adapter.BuildCustomer();
}
}
}
原始测试可以写成:
[Theory, DomainTestConventions]
public void CustomerPropertyIsCorrect2(
CardHolderCustomer expected,
[Frozen]Mock<ICustomerAdapter> builderStub,
CardHolderViewModel sut)
{
builderStub
.Setup(x => x.BuildCustomer())
.Returns(expected);
var actual = sut.Customer;
Assert.Equal(expected, actual);
}
DomainTestConventionsAttribute
定义为:
internal class DomainTestConventionsAttribute : AutoDataAttribute
{
internal DomainTestConventionsAttribute()
:base(new Fixture().Customize(new DomainTestConventions()))
{
}
}
DomainTestConventions
定义为:
internal class DomainTestConventions : CompositeCustomization
{
internal DomainTestConventions()
:base(new AutoMoqCustomization())
{
}
}
请注意,DomainTestConventions
派生自CompositeCustomization
,这基本上意味着您可以创建更多自定义项并将其作为参数添加到基础构造函数中。
您还可以阅读:
希望有所帮助。
答案 1 :(得分:0)
我认为这简洁易读。但我质疑这种测试的值。
您的测试名为 CustomerPropertyIsCorrect ,因此我认为这是您要测试的内容。由于您指示 ICustomerAdapter 的 BuildCustomer 方法返回之前创建的冻结实例,并且由于视图模型代码在xUnit中运行时将使用此代码,是的,冻结确实会返回对象。
现在,我不是全部参加TDD训练营,所以这可能只是我,而不是“得到”TDD。但据我所知,此测试将验证视图模型在其Customer属性中是否有一些 CardHolderCustomer 实例 - 但不一定是“正确”实例。那里的价值在哪里?