C# 结合SpecFlow表和Moq模拟对象
在这种情况下,我希望使用模拟对象(使用Moq),以便创建设置和期望,但也希望使用SpecFlow表提供一些属性值。是否有一种方便的方法来创建模拟并为种子值提供表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
// 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作为speclowCreateInstance
方法的基础:
[给定(@“我有一个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中正确设置属性。