Вопросы о модульном тесте - PullRequest
0 голосов
/ 13 февраля 2019

В последнее время я изучаю юнит-тест и пытаюсь использовать этот навык в своем проекте.Однако у меня есть вопрос о том, как протестировать следующий код.

 public class Class1
{
    private Timer _timer = new Timer();

    public Class1()
    {
        _timer.Interval = 1000;
        _timer.Elapsed += _timer_Elapsed;
    }

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        //some works
    }

    public void start()
    {
        _timer.Start();
        //some works

    }
    public void stop()
    {
        _timer.Stop();
        //some works
    }
}

Я действительно не знаю, как протестировать этот класс, не нарушая его инкапсуляцию.

Должен ли я выставить метод _timer_Elapsed?Эван, если сделаешь это, следующий вопрос касается того, как проверить метод 'start' и 'stop'.Должен ли я использовать объект-заглушку для замены таймера для тестирования этого класса?если это, этот класс будет слишком сложным, потому что мне нужно создать интерфейс и создать класс, который инкапсулирует Timer и реализует интерфейс выше.

public interface IEncal
{
    double Interval { get; set; }
    event ElapsedEventHandler Elapsed;
    void Stop();
    void Start();
}
public class MyClass : IEncal
{
    Timer timer = new Timer();
    public double Interval { get { return timer.Interval; } set { timer.Interval = value; } }

    public event ElapsedEventHandler Elapsed
    {
        add { timer.Elapsed += value; }
        remove { timer.Elapsed -= value; }
    }

    public void Start()
    {
        timer.Start();
    }

    public void Stop()
    {
        timer.Stop();
    }
}
public class Class1
{
    private IEncal _timer;

    public Class1(IEncal timer)
    {
        _timer = timer;
        _timer.Interval = 1000;
        _timer.Elapsed += _timer_Elapsed;
    }

    public void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        //some works
    }

    public void start()
    {
        _timer.Start();
        //some works
    }
    public void stop()
    {
        _timer.Stop();
        //some works
    }
}

Есть ли лучший способ протестировать этот класс?


Ниже приведен реальный код, который я использую.Я написал модульный тест для класса ISender и класса IInfoProducer.Поскольку я впервые использую модульный тест, я хотел бы подумать о каждом классе для обучения.

Возвращаясь к вопросу, этот класс в основном является классом Timer.По истечении этого времени он отправляет информацию.Итак, как я должен проверить этот процесс отправки времени?

public class InfomationSender
{
    private readonly Timer _timer = new Timer();
    private readonly ISender _sender;
    private readonly IInfoProducer _producer;

    public InfomationSender(ISender sender, IInfoProducer producer)
    {
        _sender = sender;
        _producer = producer;
        _timer.Interval = 1000;
        _timer.Elapsed += _timer_Elapsed;
    }

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        var info = _producer.getInfo();
        _sender.send(info);

    }

    public void start()
    {
        _timer.Start();

    }
    public void stop()
    {
        _timer.Stop();
        _sender.Dispose();
    }
}

1 Ответ

0 голосов
/ 13 февраля 2019

Вы должны быть в состоянии проверить класс без насмешек.Менее насмешливые, более ценные тесты.Но вы не предоставили информацию о том, что ваш код делает в // some works областях.Поскольку это то, что вы хотите проверить, таймер - это просто детали реализации.

Для тестирования "некоторые работы" класс должен предоставлять публичный доступ к результату "некоторых работ", иначе результат будет "выставлен" через внедренную зависимость (репозиторий, регистратор и т. Д.)

Предположим, классбудет выполнять «некоторую работу» каждую секунду и обновлять свойство Result после вызова метода Stop.

public class LiveCalculator
{
    private readonly Timer _timer;
    private List<int> _allValues
    private int _lastSum;

    public int LastSum => _lastSum;

    public LiveCalculator()
    {
        _allValues = new List<int>();
        _timer = new Timer { Interval = 1000 };
        _timer.Elapsed += _timer_Elapsed;
    }

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        _allValues.Add(42);
    }

    public void start()
    {
        _timer.Start();            
    }

    public void stop()
    {
        _timer.Stop();
        _lastResult = _allValues.Sum();
    }
}

Tests

[Fact]
public async Task AfterFiveSeconds_LastResultEquals210()
{
    var calculator = new LiveCalculator();

    calculator.Start();        
    await Task.Delay(5100);
    calculator.Stop();

    calculator.LastResult.Should().Be(210);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...