【发布时间】:2022-09-27 21:28:26
【问题描述】:
我正在尝试使用 MS 测试和 Moq 为我的一种方法创建单元测试。下面是我的接口、实现类和方法。
public interface IDocumentManagementHandler
{
Task AddData(long documentId, string metadataCategoryName, List<KeyValuePair<string, string>> metadata);
}
public class DocumentManagementHandler : IDocumentManagementHandler
{
private readonly IService _service;
private readonly IFService _fService;
public readonly ILogger _logger;
private static readonly long rootFolderId = 123456;
public DocumentManagementHandler(IService Service, IFService FService, ILogger Logger)
{
_service = Service;
_fService = FService;
_logger = Logger;
}
public Task AddData(long documentId, string metadataCategoryName, List<KeyValuePair<string, string>> metadata)
{
if(string.IsNullOrEmpty(metadataCategoryName))
throw new ArgumentNullException(nameof(metadataCategoryName));
if (metadata == null)
throw new ArgumentNullException(nameof(metadata));
return AddDocumentMetadataAsync(documentId, metadataCategoryName, metadata);
}
我的 MSTest 方法
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void TestAddData()
{
long documentID = 123;
string metadataCategoryName = null;
List<KeyValuePair<string, string>> metadata = null;
var documentHandler = new Mock<IDocumentManagementHandler>();
documentHandler.Setup(s => s.AddData(documentID, metadataCategoryName, metadata));
var newresult = documentHandler.Object.AddData(documentID, metadataCategoryName, metadata);
}
当我将变量 \"metadataCategoryName\" 作为 NULL 传递但测试失败并显示消息 \"Test method did not throw expected exception System.ArgumentNullException.\" 时,我期望测试方法通过。
知道这里出了什么问题。
-
你在嘲笑错误的对象!你想测试
DocumentManagementHandler所以不要模拟它,正常实例化它,你想模拟的是它的依赖关系:IServiceIFService和ILogger -
模拟的目标是模拟/模拟依赖项以允许您仅测试您需要的内容。
-
您可能需要存根
IService、IFService和ILogger,并将DI 的存根用于DocumentManagementHandler的具体实例。然后测试那个conte实例。 (注意:您可以使用Moq来创建存根——只是这个用例的正确术语是“存根”。)
标签: c# unit-testing moq mstest