Tengo este bloque de código que me gustaría probar
class SearchEngine { public void Search() { var module = new SearchModule(); module.Search(); } } Lo he simplificado pero no puedo proporcionar una instancia de searchmodule como parámetro de la función Search , ni como parámetro constructor de la clase SearchEngine .
¿Hay alguna manera de asegurar que el objeto del module sea falso cuando escribo la prueba de mi unidad?
Me gustaría poder hacer algunas verificaciones de CallTo en el objeto del módulo, en particular, ese module.Search() Se llamó a Search() cuando llamamos a Search()
¿Hay alguna manera de asegurar que el objeto del módulo sea falso cuando escribo la prueba de mi unidad?
No, no es posible, al menos no con la forma actual de su código. FakeItEasy no puede interceptar la creación de instancias usando new .
Si desea falsificar algo, debe proporcionarlo de alguna manera al sistema bajo prueba. El SUT no puede crearlo por sí mismo.
No puedo proporcionar una instancia de módulo de búsqueda como parámetro de la función
Search, ni como parámetro constructor de la claseSearchEngine
¿Podría inyectar una fábrica en su lugar? Algo como esto:
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(); } }A continuación, podría probar SearchEngine de esta manera:
// 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();