Не разделяйте stati c свойства в тестах - PullRequest
0 голосов
/ 13 апреля 2020

Я должен написать тесты для существующего кода с помощью xUnit. Вот упрощенная проблема, с которой я столкнулся:

using Xunit;

namespace XUnitTestProject1
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            GlobalHanler.StaticProperty = "some value";
        }

        [Fact]
        public void Test2()
        {
            Assert.Null(GlobalHanler.StaticProperty);
        }
    }

    public static class GlobalHanler
    {
        public static string StaticProperty;
    }
}

GlobalHandler владеет другим объектом, оба состояния: c

Когда я запускаю 2 теста вместе, Test2 дает сбой, потому что он видит значение, которое было установлено в Test1. Тем не менее, когда я запускаю Test2 по отдельности, это удается.

Моя цель - пройти 2 теста, когда они выполняются вместе. Мне нужно как-то сбросить глобальное свойство stati c для каждого теста в отдельности, но я не могу изменить реализацию GlobalHandler

Установка StaticProperty в каждом методе теста не представляется возможным, потому что это будет влияет на другие тесты, работающие параллельно

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Чтобы получить тестируемый код, вы должны сначала поместить лог c в класс, который можно создавать столько раз, сколько необходимо, а затем использовать этот класс в своем коде, передавая ссылку.

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

Синглтоны и тестирование не очень хорошо сожительствуют из-за возможных побочных эффектов и неясных зависимостей.

0 голосов
/ 13 апреля 2020

Вам следует избегать использования static. Вместо этого создайте простой класс и зарегистрируйте его в своем контейнере DI как одноэлементный. Тогда вы можете легко проверить это.

Простой пример:

using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main()
    {
        var serviceProvider = new ServiceCollection()
            .AddSingleton<IQueueUrlProvider, QueueUrlProvider>()
            .BuildServiceProvider();

        Console.WriteLine(serviceProvider.GetService<IQueueUrlProvider>().QueueUrl);
    }

    public interface IQueueUrlProvider
    {
        string QueueUrl { get; }
    }

    public class QueueUrlProvider : IQueueUrlProvider
    {
        private readonly Lazy<string> _getQueueUrlLazy;
        public string QueueUrl => _getQueueUrlLazy.Value;
        public QueueUrlProvider()
        {
            _getQueueUrlLazy = new Lazy<string>(GetQueueUrl);
        }

        private string GetQueueUrl()
        {
            // get url here
            return "your queue url";
        }
    }
}

https://dotnetfiddle.net/JjRh4q

...