2013-02-25 56 views
1

如何以任何其他基于该房产的成员不需要设置的方式来模拟和设置一个房产。取决于Mocked属性的房产

public interface IFoo{ 
    public Foo { get; set; } 
    public Foo2 { get; } 
} 

public class Foo :IFoo{ 
    public Foo { get; set; } 
    public Foo2 { get {return this.Foo +" second";} } 
} 


public void FooTest(){ 
    var f = Mock<IFoo>(); 
    f.SetupGet(x=> x.Foo).Returns("Foo"); 

    // Should print 'Foo second' although there's no setup for Foo2 
    Console.Write(f.Object.Foo2); 
} 

回答

1

不完全知道为什么你要做到这一点,但我首先想到的是通过类和设置的成员使用反射来循环他们中的每一个,虽然不知道真正知道为什么会有人做这个。我猜你试图节省时间?

虽然不能完全适用的,你可以塑造这对您的需求,因为它是相关的:

Generating mock objects for test cases

2

在你的榜样,你所创建的的IFoo接口的模拟,所以没有实施Foo2属性。在这种情况下,Foo对象的实现是无关紧要的,因为您从不实例化Foo对象。 f是IFoo的模拟,因此与对象Foo没有任何关系,只是它们都实现了相同的接口。你有没有尝试过这样的事情?

var f = Mock<IFoo>(); 
f.SetupGet(x => x.Foo).Returns("Foo"); 
f.SetupGet(x => x.Foo2).Returns(f.Foo + "Second"); 

我不完全确定你要完成什么,但是,所以我猜测。

+0

我怀疑从他的措辞他不想打电话给每个成员定义的安装程序,只是一个预感! – 2013-02-25 22:58:52

+1

啊,所以基本上是一个存根?如果是这样,这是一个解决这个问题的答案:http://stackoverflow.com/questions/3672463/unit-testing-mock-stub-definitions-in-moq – 2013-02-25 23:06:41

+0

现在如果我有十五个'Foo2'像成员一样,我必须设置他们全部 – Agzam 2013-02-25 23:06:45

2

在你的问题中,在类Foo中的属性Foo与它所属的类具有相同的名称是令人困惑的(并且在C#中是非法的)。你也错过了你的属性的类型(大概string)。所以请拿出一些编译的代码。

完成之后,我认为您的Mock<>只会涉及接口IFoo。可能有许多类和结构实现IFoo。 Moq怎么可能知道你正在考虑Foo其中两个属性的获取者之间存在连接?

IFoo无法指定两个属性之间的任何必需的关系;它是一个接口。