You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为接收Order对象的C#方法编写NUnit测试

NUnit测试编写:AddorGetCustomer方法的场景验证

针对你要测试的两个核心场景,下面是修正后的完整测试代码,同时指出原代码中的问题:

原测试代码的核心问题

  • 未正确Mock IMapper:方法中用到_mapper.Map<CustomerAddress>(order.BillToAddress),必须Mock这个映射行为才能控制返回的CustomerAddress实例的Email值
  • 依赖实例化不完整:_loyaltyServiceMock未定义、_mapper未初始化,导致服务实例创建失败
  • 测试方法命名不规范:应遵循“测试场景_方法名_预期结果”的命名规则,便于理解测试意图
  • 断言逻辑错误:result是Data.Customer类型,与Order类型不匹配,不能直接用Assert.AreEqual

完整测试代码

using Moq;
using NUnit.Framework;
using AutoMapper;

public class CustomerServiceTests
{
    private Mock<CRMEntities> _mockDb;
    private Mock<IMapper> _mockMapper;
    private Mock<IService> _mockService;
    private CustomerService _customerService;

    [SetUp]
    public void Setup()
    {
        // 初始化所有依赖的Mock实例
        _mockDb = new Mock<CRMEntities>();
        _mockMapper = new Mock<IMapper>();
        _mockService = new Mock<IService>();
        
        // 创建CustomerService实例,注入Mock依赖
        _customerService = new CustomerService(_mockDb.Object, _mockMapper.Object, _mockService.Object);
    }

    // 场景1:当order.BillToAddress为null时,返回null
    [Test]
    public void When_BillToAddressIsNull_AddorGetCustomer_ReturnsNull()
    {
        // Arrange:创建BillToAddress为null的Order实例
        var order = new Order
        {
            BillToAddress = null
        };

        // Act
        var result = _customerService.AddorGetCustomer(order);

        // Assert
        Assert.Null(result);
    }

    // 场景2:映射后的address.Email为null或空字符串时,返回null(参数化测试覆盖两种情况)
    [TestCase(null)]
    [TestCase("")]
    public void When_MappedAddressEmailIsNullOrEmpty_AddorGetCustomer_ReturnsNull(string email)
    {
        // Arrange:创建有BillToAddress的Order实例
        var order = new Order
        {
            BillToAddress = new Address(),
            Branch = "MW",
            OrderNumber = 1
        };

        // Mock映射行为,返回指定Email的CustomerAddress
        var mappedCustomerAddress = new CustomerAddress
        {
            Email = email
        };
        _mockMapper.Setup(m => m.Map<CustomerAddress>(order.BillToAddress))
                   .Returns(mappedCustomerAddress);

        // Act
        var result = _customerService.AddorGetCustomer(order);

        // Assert
        Assert.Null(result);
        // 验证映射方法是否被调用(可选,确保逻辑走到映射步骤)
        _mockMapper.Verify(m => m.Map<CustomerAddress>(order.BillToAddress), Times.Once);
    }
}

关键说明

  • Mock映射行为:通过_mockMapper.Setup控制Map方法的返回值,精准控制映射后的CustomerAddress的Email属性,无需依赖AutoMapper的实际配置
  • 参数化测试:用[TestCase]属性一次性覆盖Email为null和空字符串的两种情况,减少重复代码
  • 依赖注入Mock:所有外部依赖(CRMEntities、IMapper、IService)都用Moq创建Mock实例,确保测试只针对AddorGetCustomer方法本身的逻辑,不受外部依赖影响
  • 验证调用:可选的_mockMapper.Verify可以确认映射方法确实被执行,确保测试覆盖到了对应的代码分支

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:20:34