Фальшивка / макет. Net Core Conpendency Injection App - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь создать интеграционный тест, но это также зависит от стороннего сервиса, который я хочу подделать. У меня есть консольное приложение. Net Core 3.1.

Что я имею в виду:

           var configuration = GetConfiguration();

            var serviceProvider = GetServiceProvider(configuration);

            var appService = serviceProvider.GetService<IConsumerManager>();

            appService.StartConsuming(commandLineArguments);
 private static IConfiguration GetConfiguration()
            => new ConfigurationBuilder().AddJsonFile(ConfigurationFile, true, true).Build(); 

private static ServiceProvider GetServiceProvider(IConfiguration config)
    {
        IServiceCollection collection = new ServiceCollection();

        collection.Configure<ConsumerConfig>(options => config.GetSection("consumerConfig").Bind(options));

        collection.AddSingleton<IConsumerManager, ConsumerManager>();
        collection.AddTransient<ISelfFlushingQueue, SelfFlushingQueue>();
        collection.AddTransient<IConsumer, Consumer>();
        collection.AddTransient<IConverter, Converter>();

        collection.AddFactory<IConsumerWorker, ConsumerWorker>();

        return collection.BuildServiceProvider();
    }

В моем случае я хочу имитировать звонки в Consumer. И мне интересно, есть ли другой способ подделать вызовы к нему, чем просто создать класс Fake и добавить его в DI. Например:

collection.AddTransient<IConsumer, FakeConsumer>(); 

Может быть, я мог бы использовать FakeItEasy, NUnit или любую другую библиотеку для фальсификации этого?

1 Ответ

1 голос
/ 10 марта 2020

Вы можете создавать макеты, используя ваши любимые рамки для макетов, и добавлять их в свою коллекцию сервисов.

Пример, используя Moq:

var mock = new Mock<IConsumer>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true); // this line is just an example of mocking a method named DoSomething, you'll have to adapt it to the methods you want to mock

collection.AddTransient<IConsumer>(() => mock.Object); 

https://github.com/Moq/moq4/wiki/Quickstart

...