【问题标题】:MS Tests/ Moq - ExpectedException failingMS 测试/起订量 - ExpectedException 失败
【发布时间】: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 所以不要模拟它,正常实例化它,你想模拟的是它的依赖关系:IServiceIFServiceILogger
  • 模拟的目标是模拟/模拟依赖项以允许您仅测试您需要的内容。
  • 您可能需要存根IServiceIFService ILogger,并将DI 的存根用于DocumentManagementHandler 的具体实例。然后测试那个conte实例。 (注意:您可以使用Moq 来创建存根——只是这个用例的正确术语是“存根”。)

标签: c# unit-testing moq mstest


【解决方案1】:

您的问题:您正在使用一个模拟表示包含您要测试的方法的对象的接口,这意味着您的代码永远不会真正被调用(断点会揭示这个特定问题)。

至于您应该如何编写测试:

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void TestAddData()
{
    long documentID = 123;
    string metadataCategoryName = null;
    List<KeyValuePair<string, string>> metadata = null;
        
    // Configure as needed using Mock.Get()
    var service = Mock.Of<IService>(); 
    var fService = Mock.Of<IFService>();
    var logger = Mock.Of<ILogger>();

    var documentHandler = new DocumentManagementHandler(service, fService, logger);

    documentHandler.AddData(documentID, metadataCategoryName, metadata);   
}

此外,您可能想要断言异常中包含的数据。例如。检查您的ArgumentNullException 报告的参数名称是否正确

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2014-06-09
    • 2014-06-10
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多