【问题标题】:How to make any instance creation a fake (FakeItEasy)?如何使任何实例创建成为假的(FakeItEasy)?
【发布时间】:2022-01-22 05:14:52
【问题描述】:

我有这段代码要测试

class SearchEngine
{
    public void Search()
    {
        var module = new SearchModule();
        module.Search();
    }
}

我已经简化了它,但我不能提供一个 searchmodule 实例作为函数 Search 的参数,也不能作为类 SearchEngine 的构造函数参数。

在我编写单元测试时,有没有办法确保 module 对象是 fakeiteasy fake?

我希望能够对模块对象进行一些CallTo 验证,特别是在我们调用Search() 时调用了module.Search()

【问题讨论】:

    标签: c# unit-testing fakeiteasy


    【解决方案1】:

    在我编写单元测试时,有没有办法确保模块对象是 fakeiteasy fake?

    不,这是不可能的,至少在您的代码的当前形状下是不可能的。 FakeItEasy 无法拦截使用new 的实例创建。

    如果您想伪造某些东西,则必须以某种方式将其提供给被测系统。 SUT 无法自行创建。

    我不能提供 searchmodule 实例作为函数Search 的参数,也不能作为类SearchEngine 的构造函数参数

    你能注入一个工厂来代替吗?像这样的:

    public interface ISearchModuleFactory
    {
        SearchModule Create();
    }
    
    
    class SearchEngine
    {
        private readonly ISearchModuleFactory _searchModuleFactory;
    
        public SearchEngine(ISearchModuleFactory searchModuleFactory)
        {
            _searchModuleFactory = searchModuleFactory;
        }
    
        public void Search()
        {
            var module = _searchModuleFactory.Create();
            module.Search();
        }
    }
    

    然后您可以像这样测试 SearchEngine:

    // Arrange
    var factory = A.Fake<ISearchModuleFactory>();
    var module = A.Fake<SearchModule>();
    A.CallTo(() => factory.Create()).Returns(module);
    var searchEngine = new SearchEngine(factory);
    
    // Act
    searchEngine.Search();
    
    // Assert
    A.CallTo(() => module.Search()).MustHaveHappened();
    

    【讨论】:

    • 我喜欢这种方法,它还有助于扩展未来可能添加的模块。感谢您提出一些超出我的问题的建议,我有点生疏,这正是我所需要的!
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2016-11-15
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多