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

标签 c# unit-testing fakeiteasy

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

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/

相关文章:

c# - 从网页中抓取内容

java - 单元测试由@Around 建议建议的方法

asp.net-mvc - 有可能模拟/伪造扩展方法?

c# - 正在测试的方法调用 IQueryable.SingleOrDefault 时出错

c# - C#中获取属性setter的方法名

c# - 将视频上传到 youtube channel 时出错

c# - 如何更改传递给方法的对象中属性的显示顺序 (WCF)

ios - UITableView 单元的单元测试。访问单元的 Nib

c++ - 使用具有相对路径的文件的 Visual Studio 单元测试

c# - 方法重载解析如何工作(LINQ Where 扩展方法)?