Настройка приватной переменной в классе для теста Nunit - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать модульный тест для класса, но класс имеет переменную Private, инициированную при создании класса ..

public class OrderFormService : IOrderFormService
{
    private readonly IOrderItems _orderItems;
    private readonly string _orderStartingGroup;

    // constructor
    public OrderFormService(IOrderItems orderItems)
    {
        _orderItems = orderItems;
        _orderStartingGroup = "Sales";
    {

    // Other Methods

}

Я пытаюсь написать модульный тест сейчас ичтобы протестировать метод в этом классе, и он использует переменную _orderStartingGroup ...

[TestFixture]
public class OrderFormServiceTests
{
    private ITreatmentFormService _service;
    private Mock<IOrderItems> _orderItems;

    [SetUp]
    public void SetUp()
    {
        _orderItems = new Mock<IOrderItems>();
        _service = new OrderFormService(_orderItems);
    }
}

Можно ли настроить _orderStartingGroup в OrderFormServiceTest, чтобы его можно было использовать в модульных тестах для тестирования некоторых методов в OrderFormService?Если да, то как мне это сделать?Я пытался найти его в Google, но результаты говорят о доступе к закрытым переменным в классе, который вы тестируете, но это не то, что я пытаюсь сделать.

Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я думаю, это может указывать на то, что вы делаете что-то не так.Я бы предпочел сосредоточиться на открытых интерфейсах, а не тестировать внутреннюю реализацию.Если это как-то отражено в общедоступном интерфейсе, должен быть способ установить его через общедоступный интерфейс или соглашение (скажем, чтение из файла конфигурации).

Но если вам абсолютно необходимо это сделать, вы можете рассмотреть следующие вопросы:

  1. Использовать ответ Фабяна

  2. Установить значение частного поля с отражением

  3. Сделайте этот закрытый член защищенным и создайте производный класс тестирования.

0 голосов
/ 10 декабря 2018

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

Есть несколько способов, какразобраться с этой проблемой.Простейшим решением было бы изменить сигнатуру ctor путем добавления необязательного параметра:

// constructor
public OrderFormService(IOrderItems orderItems, string orderStartingGroup = null)
{
    _orderItems = orderItems;
    _orderStartingGroup = orderStartingGroup ?? "Sales";
{

и использовать его в модульном тесте:

[SetUp]
public void SetUp()
{
    _orderItems = new Mock<IOrderItems>();
    _service = new OrderFormService(_orderItems, “testValue”);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...