Почему я не получаю проходной балл - PullRequest
0 голосов
/ 31 января 2020

У меня есть некоторый код:

public class ProcessManager : IProcessManager
{
private readonly IFolderWatcher _folderWatcher;
private readonly ILogger _logger;
private readonly Action<string> _action;
private readonly IReadFiles _readFiles;
private readonly IBankStatementComparisonManager _bankStatementComparisonManager;
private readonly IPrepareIncomingBankStatementRecords _prepareIncomingBankStatementRecords;

public ProcessManager(IFolderWatcher folderWatcher, ILogger logger,IReadFiles readFiles, IBankStatementComparisonManager bankStatementComparisonManager, IPrepareIncomingBankStatementRecords prepareIncomingBankStatementRecords)
{
    this._folderWatcher = folderWatcher;
    this._logger = logger;
    this._readFiles = readFiles;
    this._bankStatementComparisonManager = bankStatementComparisonManager;
    this._prepareIncomingBankStatementRecords = prepareIncomingBankStatementRecords;

    _action = ProcessFile;
}

public void Start() { StartMainProcess(); }

private void StartMainProcess()
{
    try
    {
    _folderWatcher.StartFolderWatcher(_action); 
    }
    catch (Exception e)
    {    
    _logger.Error("Failed To Start Folder Watcher.  Shutting Down.");
    _logger.Error("Error Message: " + e.Message);
    _logger.Error("Inner Exception: " + e.InnerException);
    }
}
}

И тест:

    public void Test()
    {
        //Arrange
        var mockFolderWatcher = new Mock<IFolderWatcher>();
        var mockLogger = new Mock<ILogger>();
        var mockRFiles = new Mock<IReadFiles>();
        var mockBankStatementComparisonManager = new Mock<IBankStatementComparisonManager>();
        var mockPrepareIncomingBankStatementRecords = new Mock<IPrepareIncomingBankStatementRecords>();
        var mockAction = new Mock<Action<string>>();

        ProcessManager target = new ProcessManager(mockFolderWatcher.Object, mockLogger.Object, mockRFiles.Object, mockBankStatementComparisonManager.Object, mockPrepareIncomingBankStatementRecords.Object);

        //Act
        target.Start();

        //Assert
        mockFolderWatcher.Verify(m => m.StartFolderWatcher(mockAction.Object), Times.Once());
    }

Когда я запускаю тест (в отладке), я вижу, что mockFolderWatcher.Invocations.Count = 1.
Однако мой тест не пройден, и я получаю эту ошибку:

Moq.MockException HResult = 0x80131500 Сообщение = Ожидаемый вызов для макета один раз, но был 0 раз: m => m.StartFolderWatcher (Действие)

Так почему я получаю ошибку и ошибку?

1 Ответ

2 голосов
/ 31 января 2020

Ваше утверждение:

mockFolderWatcher.Verify(m => m.StartFolderWatcher(mockAction.Object), Times.Once());

Говорит, что StartFolderWatcher должен быть вызван с указанным c Action (mockAction.Object). Это не так: он вызывается с Action, который был создан с помощью ProcessManager и который указывает на его метод ProcessFile.

Вы, вероятно, хотите сказать «Убедитесь, что StartFolderWatcher был вызван с помощью any Action ":

mockFolderWatcher.Verify(m => m.StartFolderWatcher(It.IsAny<Action<string>>()), Times.Once());

По умолчанию Moq принимает любые вызовы, для которых вы не настроили ожидания (вы можете изменить это, указав MockBehaviour.Strict при создании макета, если хотите). Вот почему Мок молча принял вызов StartFolderWatcher, который фактически был сделан ProcessManager.

. Вы можете позвонить mockFolderWatcher.VerifyNoOtherCalls();, чтобы проверить, не было ли сделано никаких других неожиданных вызовов на ваш макет.

...