【发布时间】:2019-09-27 21:16:49
【问题描述】:
我正在为使用 SSH.Net 上传文件的方法编写一些单元测试。
该项目是一个 WPF 应用程序,使用 Caliburn.Micro 作为 MVVM 框架,并在我正在测试的类的构造函数中注入以下对象:
private IFileTransferManager _fileTransferManager;
public FileUploadViewModel(IFileTransferManager fileTransferManager) : base(eventAggregator)
{
_fileTransferManager = fileTransferManager;
}
在测试项目中我正在模拟 IFileTransferManager:
private Mock<IFileTransferManager> _fileTransferManager = new Mock<IFileTransferManager>();
但现在我明白了,在代码中我需要从 IoC 容器请求 IFileTransferManager 的新实例,IoC 是 Caliburn.Micro 中的一个静态类:
_fileTransferManager = IoC.Get<IFileTransferManager>();
await _fileTransferManager.UploadFile(connection, file.FullName, destinationPath).ConfigureAwait(false);
我如何重构上述代码以使其可测试,因为目前它在 Caliburn.Micro.dll 中抛出 System.InvalidOperationException,因为我正在重新实例化 _fileTransferManager?
【问题讨论】:
-
使用 Func 委托注入工厂。我很好奇,如果已经通过构造函数注入了一个新实例,为什么还需要一个新实例?
-
理想情况下,您永远不必像这样直接调用您的 IoC 容器。如果该类在构造函数中注入了
IFileTransferManager,那么您不必担心它,因为在实例化该类以进行测试时,您只需直接将其传递给您的模拟。 -
@Nkosi 这个问题与另一个问题有关stackoverflow.com/questions/57902034/… 我也在使用进度条来跟踪上传进度,但是如果我同时进行多次上传,进度条就不起作用了适当地。我找到的解决方法是为我上传的每个文件请求一个新的 IFileTransferManager。
标签: c# unit-testing moq xunit