2012-12-19 23 views
4

我有,我想用嘲笑的對象(使用起訂量),所以我可以創建設置和預期的情況下,也希望提供一些使用SpecFlow表的屬性值。有沒有一種方便的方法來創建模擬併爲種子值提供表格?結合SpecFlow表和起訂量嘲笑對象

// Specflow feature 

Scenario Outline: MyOutline 
Given I have a MyObject object as 
| Field | Value  | 
| Title | The Title | 
| Id | The Id | 


// Specflow step code  

Mock<MyObject> _myMock; 

[Given(@"I have a MyObject object as")] 
public void GivenIHaveAMyObjectObjectAs(Table table) 
{ 
    var obj = table.CreateInstance<MyObject>(); 

    _myMock = new Mock<MyObject>(); 

    // How do I easily combine the two? 

} 

回答

3

有是取Func<T> methodToCreateTheInstanceCreateInstance過載。你可以用它來傳遞一個已經設置模擬爲基礎的speclow CreateInstance方法:

[Given(@"I have a MyObject object as")] 
public void GivenIHaveAMyObjectObjectAs(Table table) 
{ 
    _myMock = new Mock<MyObject>(); 
    //you need to do all the setup before passing _myMock to table.CreateInstance 
    _myMock.Setup(o => o.SomeProperty).Returns("someValue"); 

    var obj = table.CreateInstance<MyObject>(() => _myMock.Object); 

    _myMock.VerifySet(foo => foo.Title = "The Title"); 
} 
+0

使用它,我喜歡這一點。很多!謝謝 – Confused

+0

不錯,但是你不需要調用myMock.SetupAllProperties()?至少僅用於接口和抽象的定義。 – AlSki

+0

@AlSki感謝額外的信息,並根據老年退休金計劃需要一個'_myMock.SetupAllProperties()'可能是必要的,但不知道如何具體'MyObject'看起來是隻是猜測。無論如何,問題是如何將moq和Specflow結合起來,而不是關於如何在moq中正確設置屬性。 – nemesv

3

如果對象是不是嘲笑你會簡單地使用輔助傭工(見https://github.com/techtalk/SpecFlow/wiki/SpecFlow-Assist-Helpers),但因爲你需要調用安裝(...),那麼它將無法正常工作。

但是你也可以使用StepArgumentTransformation這樣

[StepArgumentTransformation] 
    public Mock<MyData> MockMyDataTransform(Table table) 
    { 
     MyData myData = new Mock<MyData>(); 
     var row = table.Rows[0]; 
     if (table.ContainsColumn("MyField")) 
     { 
      myData.Setup(x=>x.MyField).Returns(row["MyField"]); 
     } 
    .... 
    } 

[Given(@"something like:")] 
    private void GivenSomethingLike(Mock<MyData> myData) 
    .... 
+0

謝謝,這很有用。 – Confused