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

问题描述:

是否可以检查发送到Mocked方法的对象的属性是什么?例如我有:使用Moq检查传回给模拟的对象的属性

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。我想确保它获得美孚的一个实例,其SomeNumber被设置为12。

这是给你一个很好的参考... 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 
} 
+0

我编辑我的代码样本为伪代码是垃圾 – BenCr 2011-04-13 15:59:26

+0

不需要编辑。我建议回调后收到它。该文档不是很好解释回调解决什么问题。我试图使用SetupProperty来跟踪存根的值。但是我不喜欢那个,因为这意味着我的所有属性都必须是虚拟的。 – uriDium 2011-04-13 16:04:19