4

セットアップと期待値を作成できるように (Moq を使用して) モック オブジェクトを使用したい状況がありますが、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?

}
4

2 に答える 2

3

を受け取るオーバーロードがCreateInstanceありますFunc<T> methodToCreateTheInstance。これを使用して、既にセットアップされたモックを speclowCreateInstanceメソッドのベースとして渡すことができます。

[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");
}
于 2012-12-19T13:29:23.803 に答える
3

オブジェクトがモックされていない場合は、単純にアシスト ヘルパーを使用します ( https://github.com/techtalk/SpecFlow/wiki/SpecFlow-Assist-Helpersを参照) が、Setup(...) への呼び出しが必要なため、うまくいきません。

ただし、このように 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)
    ....
于 2012-12-19T13:36:24.860 に答える