【发布时间】:2018-04-04 08:25:59
【问题描述】:
由于模拟框架 (NSubstitute) 的工作方式,我在单元测试中遇到了问题。
我想测试一个接收参数的方法,在该方法内部,我正在使用 new 运算符创建一个新对象,并将这个新对象传递给将构建另一个对象的构建器。我的问题是我不能模拟构建器来返回我想要的,因为当我配置返回对象时,它会根据引用来做。
所以如果我新创建的对象是这样的:
class MyReferenceType
{
public String Property1 { get; set; }
public String Property2 { get; set; }
public String Property3 { get; set; }
}
如果我的模拟我会创建一个MyReferenceType 类型的新对象,我会这么说
myBuilder.Build(myReferenceTypeObject).Returns(anotherObject);
在我的方法中,对象myReferenceTypeObject 将有另一个引用,它不会返回我想要的对象。
那么有没有办法根据对象的属性内容而不是它的引用来配置模拟的返回对象?
这是一些代码:
class Mapper
{
private Builder builder;
public Mapper(Builder builder)
{
this.builder = builder;
}
public string Map(string data)
{
//process the string
MyReferenceType obj = new MyReferenceType();
return this.builder.Build(obj);
}
}
【问题讨论】:
-
您能否提供一个我们可以测试的完整示例?这将使验证解决方案变得更加容易。
-
@DaisyShipton 给你
-
什么是
Builder?试图使用它的测试在哪里?理想情况下,我们应该能够复制、粘贴、编译和运行示例,而无需猜测其他任何内容。 -
代码很大...但这是它的一个简单版本...我认为没有人将所有生产代码放在这里...您可以看到 builder.Build() 将返回MyReferenceType 类型的字符串
-
我不是要你发布你的整个生产代码。我要求您发布一个完整的示例。是的,我可能会花更多时间猜测其余代码的样子,但是 a) 我可能猜错了,浪费了大家的时间; b) one 人(寻求帮助的人)花一点时间在问题中将一个完整的例子放在一起比 everyone 试图帮助你的人更合适不得不这样做。
标签: c# unit-testing mocking nsubstitute