【问题标题】:Combining SpecFlow table and Moq mocked object结合 SpecFlow 表和 Moq 模拟对象
【发布时间】:2013-11-04 05:51:23
【问题描述】:

我有一种情况,我想使用一个模拟对象(使用 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?

}

【问题讨论】:

    标签: c# moq specflow


    【解决方案1】:

    如果对象没有被模拟,您只需使用辅助助手(请参阅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)
        ....
    

    【讨论】:

      【解决方案2】:

      CreateInstance 的重载需要 Func&lt;T&gt; methodToCreateTheInstance。您可以使用它来传递已设置的模拟作为 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");
      }
      

      【讨论】:

      • 我喜欢这样。很多!谢谢
      • 很好,但您不需要调用 myMock.SetupAllProperties() 吗?至少对于接口和仅抽象定义。
      • @AlSki 感谢您提供额外信息,根据 OP 的需要,_myMock.SetupAllProperties() 可能是必要的,但不知道具体的MyObject 看起来如何,这只是猜测。无论如何,问题是关于如何结合起订量和 Specflow,而不是关于如何在起订量中正确设置属性。
      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2016-04-20
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多