2013-02-25 57 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無法指定兩個屬性之間的任何必需的關係;它是一個接口。