Можно ли смоделировать локальную переменную метода с помощью NSubstitute? - PullRequest
0 голосов
/ 29 октября 2019

Например, у меня есть класс с методом Process, в этом методе я настроил несколько вещей, например:

public class messageProcessor
{
...
  public string Process(string settings)
  {
    var elementFactory = new ElementFactory();
    var strategyToUse = new legacyStrategy();
    ...
    var resources = new messageResource(
       elementFactory,
       strategyToUse,
       ...);
  }
}

Могу ли я создать экземпляр этого класса, но когда я вызываюМетод процесса, замените (например) elementFactory, чтобы он был установлен на мою фабрику.

Возможно ли это и как мне это сделать? Спасибо

1 Ответ

2 голосов
/ 29 октября 2019

Если ваш код зависит от ElementFactory, вы можете добавить интерфейс этого класса через конструктор класса MessageProcessor.

Это называется "Инверсия управления" .

Так, например, вы создали интерфейс IElementFactory, который вы можете внедрить в класс с помощью конструктора следующим образом:

public class messageProcessor
{
    private readonly IElementFactory elementFactory;

    public messageProcessor(IElementFactory elementFactory)
    {
        this.elementFactory = elementFactory;
    }

    public string Process(string settings)
    {
        var strategyToUse = new legacyStrategy();
        ...
        var resources = new messageResource(
           this.elementFactory,
           strategyToUse,
           ...);
    }
}

Теперь в своем тесте вы можете внедритьзаменитель IElementFactory. Например:

public void Test()
{
    var elementFactory = Substitute.For<IElementFactory>();

    // tell the substitute what it should return when a specific method is called.
    elementFactory.AnyMethod().Returns(something);

    var processor = new messageProcessor(elementFactory);
}

Во время выполнения ваше приложение должно внедрить экземпляр IElementFactory в класс messageProcessor. Вы должны сделать это через «Внедрение зависимости» .

...