如何为接收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
相关产品推荐
相关产品推荐

