如何安排我的模拟的一个属性来设置另一个属性?

时间:2017-09-22 12:21:17

标签: c# unit-testing justmock

所以我试图模拟一个接口,该接口包含我的单元测试最初必须设置的属性,然后被测试对象改变,然后我的断言查看结果。

测试中的代码如下所示:

public class Foo
{
    IEnumerable<int> IntList { get; set; }

    public void Bar(IBaz baz)
    {
        if (baz == null)
            throw new ApplicationException();

        if (baz.IntList == null)
            baz.IntList = new List<int>();

        this.IntList = baz.IntList;
    }
}

我在这样的工厂里嘲笑我的界面:

public class BazFactory
{
    public IEnumerable<int> IntList { get; set; }

    public IBaz Create()
    {
        IBaz baz = Mock.Create<IBaz>();
        baz.Arrange(x => x.IntList).Returns(this.IntList);
        return baz;
    }
}

我的单元测试就像这样消耗它:

[Fact]
public void WithNullIntList_InitializesNew()
{
    //Arrange
    Foo foo = new Foo();
    BazFactory factory = new BazFactory();
    IBaz baz = factory.Create();

    //Act
    foo.Bar(baz);

    //Assert
    Assert.NotNull(foo.IntList);
}

显然,这不起作用,因为虽然foo.Bar()尝试更改baz.IntList,但它仍然会返回factory.IntList,但尚未更改。

我需要的是能够安排baz.IntList以便在设置时,传递给它的值会转移factory.IntList。我只看到了如何使用mock类中的变量执行此操作的文档,以及如何使用方法执行此操作,但不使用属性的setter。

我觉得我应该像这样添加一行到BazFactory.Create(),但以下代码不起作用。

baz.ArrangeSet(x => this.IntList = x.IntList);

如何在动作的上下文中表达“传递给baz.IntList”的值?

如果它有所不同,我使用的是JustMock的Lite版本。

0 个答案:

没有答案