C# 结合SpecFlow表和Moq模拟对象

C# 结合SpecFlow表和Moq模拟对象,c#,moq,specflow,C#,Moq,Specflow,在这种情况下,我希望使用模拟对象(使用Moq),以便创建设置和期望,但也希望使用SpecFlow表提供一些属性值。是否有一种方便的方法来创建模拟并为种子值提供表 // Specflow feature Scenario Outline: MyOutline Given I have a MyObject object as | Field | Value | | Title | The Title | | Id | The Id | // Specflow step c

在这种情况下,我希望使用模拟对象(使用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?

}
//Specflow功能
场景大纲:MyOutline
假设我有一个MyObject对象作为
|字段|值|
|头衔|头衔|
|身份证|身份证|
//Specflow步骤代码
Mock_myMock;
[给定(@“我有一个MyObject对象作为”)]
public void GivenIHaveAMyObjectObjectAs(表)
{
var obj=table.CreateInstance();
_myMock=新Mock();
//如何轻松地将两者结合起来?
}

有一个重载
CreateInstance
,它使用
Func方法创建实例。您可以使用它传递一个已经设置好的mock作为speclow
CreateInstance
方法的基础:

[给定(@“我有一个MyObject对象作为”)]
public void GivenIHaveAMyObjectObjectAs(表)
{
_myMock=新Mock();
//在将_myMock传递给table.CreateInstance之前,需要执行所有设置
_Setup(o=>o.SomeProperty).Returns(“someValue”);
var obj=table.CreateInstance(()=>\u myMock.Object);
_myMock.VerifySet(foo=>foo.Title=“标题”);
}

如果对象未被模拟,您只需使用辅助助手(请参阅),但由于您需要调用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"]);
        }
     ....
    }
[StepArgumentTransformation]
公共模拟MockMyDataTransform(表)
{
MyData MyData=new Mock();
var row=表。行[0];
if(表.ContainsColumn(“MyField”))
{
设置(x=>x.MyField).Returns(第[“MyField”行]);
}
....
}
和它一起使用

    [Given(@"something like:")]
    private void GivenSomethingLike(Mock<MyData> myData)
    ....
[给定(@“类似:”)]
私有void GivenSomethingLike(模拟myData)
....

我喜欢这样。很多谢谢,但是您不需要调用myMock.SetupAllProperties()吗?至少对于接口和仅抽象的定义。@AlSki感谢您提供的附加信息,并根据OPs需要使用
\u myMock。可能需要SetupAllProperties()
,但不知道具体的
MyObject
看起来像是在猜测。不管怎么说,问题在于如何结合moq和Specflow,而不是如何在moq中正确设置属性。