为什么我的单元测试没有通过

Why I am not getting a pass on my unit test

我有一些代码:

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 Message= Expected invocation on the mock once, but was 0 times: m => m.StartFolderWatcher(Action)

那么为什么我会失败并出现错误?

你的主张:

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

表示 StartFolderWatcher 必须 与特定的 Action (mockAction.Object) 一起调用。事实并非如此:它是通过 ProcessManager 创建的 Action 调用的,它指向它的 ProcessFile 方法。

你可能想说 "Verify that StartFolderWatcher was called with any Action":

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

默认情况下,Moq 接受您没有设置预期的任何调用(如果需要,您可以在创建模拟时通过指定 MockBehaviour.Strict 来更改此设置)。这就是为什么 Moq 默默地接受了 ProcessManager.

实际发出的对 StartFolderWatcher 的调用

您可以调用 mockFolderWatcher.VerifyNoOtherCalls(); 来检查是否没有对您的模拟进行其他意外调用。