TDD如何断言POCO的属性是在正在测试的方法中设置的

时间:2014-07-09 15:54:49

标签: c# dependency-injection tdd nsubstitute

我们正在使用TDD和DI方法以及NSubstitute创建一个C#应用程序。

我们正在撰写CreateThing方法:

  • namedescription字符串作为参数
  • 创建新的Thing对象
  • 从方法参数
  • 设置Name的{​​{1}}和Description属性
  • Thing设置为Status
  • Active传递给另一个类上的方法(通过构造函数注入)以进行进一步处理

我们知道如何使用ThingSubstitute.For为其他类的调用编写测试。

我们如何为正在设置的.Received()属性编写测试?

1 个答案:

答案 0 :(得分:3)

您可以使用Argument matchers即条件匹配器,它看起来像Arg.Is<T>(Predicate<T> condition)。你的匹配器看起来像:

anotherClass.Received().Process(Arg.Is<Thing>(thing => !string.IsNullOrEmpty(thing.Name)));

完整列表:

public class Thing
{
    public string Name { get; set; }
}

public class AnotherClass
{
    public virtual void Process(Thing thing)
    {
    }
}

public class CreateThingFactory
{
    private readonly AnotherClass _anotherClass;

    public CreateThingFactory(AnotherClass anotherClass)
    {
        _anotherClass = anotherClass;
    }

    public void CreateThing()
    {
        var thing = new Thing();
        thing.Name = "Name";
        _anotherClass.Process(thing);
    }
}

public class CreateThingFactoryTests
{
    [Fact]
    public void CreateThingTest()
    {
        // arrange
        var anotherClass = Substitute.For<AnotherClass>();
        var sut = new CreateThingFactory(anotherClass);

        // act
        sut.CreateThing();

        // assert
        anotherClass.Received().Process(Arg.Is<Thing>(thing => !string.IsNullOrEmpty(thing.Name)));
    }
}