2012-12-19 74 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