gpt4 book ai didi

c# - 基于对象的属性而不是它的引用模拟设置返回类型

转载 作者:行者123 更新时间:2023-11-30 23:03:56 25 4
gpt4 key购买 nike

由于模拟框架 (NSubstitute) 的工作方式,我在单元测试中遇到了问题。

我想测试一个接收参数的方法,在该方法内部,我使用 new 运算符创建一个新对象,并将这个新对象传递给将构建另一个对象的构建器。我的问题是我无法模拟生成器返回我想要的内容,因为当我配置返回对象时,它会根据引用执行。

所以如果我新创建的对象是这样的:

class MyReferenceType
{
public String Property1 { get; set; }

public String Property2 { get; set; }

public String Property3 { get; set; }
}

如果我的 mock 如果我创建一个类型为 MyReferenceType 的新对象,我会这样说

myBuilder.Build(myReferenceTypeObject).Returns(anotherObject);

在我的方法中,对象 myReferenceTypeObject 将有另一个引用,它不会返回我想要的对象。

那么有没有一种方法可以根据对象的属性内容而不是它的引用来配置 mock 的返回对象?

这是一些代码:

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);
}
}

最佳答案

无法使引用匹配。您无法在被测方法之外控制该对象,因为它是在方法内初始化的。

使用 Arg.Any<T>()用于使模拟期望在被行使时更加灵活的论点,因为它将忽略传递的特定论点。

根据提供的代码示例,一个简单的测试看起来像

//Arrange
var data = "some data";
var myBuilder = Substitute.For<Builder>();
var expected = "some value";
myBuilder.Build(Arg.Any<MyReferenceType>()).Returns(expected);

var subject = new Mapper(myBuilder);

//Act
var actual = subject.Map(data);

//Assert
Assert.AreEqual(expected, actual);

这将允许模拟在调用时按预期行为。

如果你想有条件地匹配参数使用Arg.Is<T>(Predicate<T> condition)

myBuilder
.Build(Arg.Is<MyReferenceType>(_ => _.Property1 == "value1" && _.Property2 == "value2"))
.Returns(expected);

如果传递的参数满足预期条件,则行为应与上述预期相同。

引用 NSubstitute: Argument matchers

关于c# - 基于对象的属性而不是它的引用模拟设置返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com