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