如何使任何实例创建都是假的(FakeItEasy)?

How to make any instance creation a fake (FakeItEasy)?

我有这段代码要测试

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

我已经简化了它,但我不能提供搜索模块实例作为函数 Search 的参数,也不能作为 class SearchEngine.[=17= 的构造函数参数]

有没有办法确保 module 对象在我编写单元测试时是一个 fakeiteasy 假货?

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

时调用了 module.Search()

Is there a way to insure that the module object will be a fakeiteasy fake when I write my unit test?

不,这是不可能的,至少对于您的代码的当前形状而言是不可能的。 FakeItEasy 无法使用 new.

拦截实例创建

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

I cannot provide a searchmodule instance as a parameter of the function Search, nor as a constructor parameter of the class 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();