为什么我的单元测试没有通过
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();
来检查是否没有对您的模拟进行其他意外调用。
我有一些代码:
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();
来检查是否没有对您的模拟进行其他意外调用。