gpt4 book ai didi

c# - FakeItEasy 模拟对象修改方法

转载 作者:行者123 更新时间:2023-12-04 10:59:57 24 4
gpt4 key购买 nike

我正在尝试为依赖依赖项的方法编写单元测试,该依赖项提供接受对象并修改它的方法,但不会在“新路径”上返回它,例如作为返回值或通过引用参数。

public class Product
{
public string Name { get; set; }
}

public interface IFixer
{
void Modify(Product product);
}

public class Fixer: IFixer
{
public void Modify(Product product)
{
if (string.IsNullOrEmpty(product.Name))
{
product.Name = "Default";
}
}
}

public class Manager()
{
private readonly IFixer _fixer;

public Manager(IFixer fixer)
{
_fixer = fixer;
}

public bool IsProductNew(int id)
{
var product = GetProduct(id); // Gets an object instance from a repository, e.g. a file or a database, so we can have something to operate on.

_fixer.Modify(product);

return product.Name != "Default";
}
}

所以我希望能够测试我的 Manager 类的 IsProductNew() 方法:

var fakeFixer = A.Fake<IFixer>();

var manager = new Manager(fakeFixer);

var isNew = manager.IsProductNew(A<int>._);

Assert.True(isNew);

我在这里缺少的是:如何模拟 IFixer.Modify() 的行为,即让它修改 Product 对象实例?

最佳答案

有效地回答这个问题取决于 GetProduct(id);

的定义

但是,如果 IFixer 实现没有影响或不良行为,那么就真的没有必要模拟它。

//Arrange
var fixer = new Fixer();
var manager = new Manager(fixer);

//Act
var isNew = manager.IsProductNew(1);

//Assert
Assert.True(isNew);

但要回答

How do I mock the behaviour of IFixer.Modify(), i.e. have it modify a Product object instance?

您需要一个捕获匹配参数的回调

//Arrange
var fakeFixer = A.Fake<IFixer>();
A.CallTo(() => fakeFixer.Modify(A<Product>._))
.Invokes((Product arg) => arg.Name = "Not Default Name");

var manager = new Manager(fakeFixer);

//Act
var isNew = manager.IsProductNew(1);

//Assert
Assert.True(isNew);

引用Invoking Custom Code

关于c# - FakeItEasy 模拟对象修改方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877236/

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