使用Moq检查传回模拟的对象的属性

时间:2011-04-13 15:35:43

标签: c# unit-testing moq

是否可以检查发送给Mocked方法的对象的属性是什么?例如,我有:

public class Foo
{
    int SomeNumber {get; set;}
}

public class ReceivesFoo: IReceivable
{
    public void Process(Foo foo)
    {
    }
}

public class Bar
{
    private IReceivable receiver;

    public void SomeMethod(int b)
    {
        Foo foo = new Foo();
        if (b == 0)
        {
            foo.SomeNumber = 12;
        }
        else
        {
            foo.SomeNumber = 7;
        }
        receiver.Process(foo);
    }
}

public class TestBar
{
    public void ZeroReceives12()
    {
        mockReceivable.Setup(x => x.Process(It.IsAny<Foo>());
        bar.SomeMethod(0);
    }
}

这是一个非常简化,但希望你知道我得到了什么。我知道在方法中创建一个新类是个坏主意。所以这是在各种工厂的其他地方完成的。但是,设置新对象的各种属性的所有逻辑都是在此方法中完成的。因为将该逻辑放在工厂中是没有意义的,因为它与工厂无关,而且事情会根据Bar的状态而改变。

所以基本上我只是希望能够做的不仅仅是验证模拟的接收器会收到某种Foo。我想确保它收到一个Foo实例,并将其SomeNumber设置为12。

1 个答案:

答案 0 :(得分:2)

这是一个很好的参考资料...... https://github.com/Moq/moq4/wiki/Quickstart

基本上你想要这样的东西......

public void ZeroReceives12()
{
    int input;

    mockReceivable.Setup(x => x.Process(It.IsAny<Foo>())
              .Callback(y => foo = y);

    bar.SomeMethod(0);

    // ensure input is what you expect
}