使用Moq模拟EF DBContext时遇NUnit测试报错排查
使用Moq模拟EF DBContext进行NUnit测试时的问题
遇到的两类错误
- OneTimeSetUp: System.ArgumentException : 无法实例化类Tracker.Models.TrackerContext.TrackerContext的代理。
- OneTimeSetUp: Moq.MockException : ImisContext.TrackerOrderBridges = InternalDbSet
调用因严格Mock行为失败。所有Mock上的调用都必须有对应的设置。
背景说明
- TrackerContext本身无问题,在未引入iMIS Context的其他测试类中可正常使用。
- TrackerContext采用Code First模式,结合IConfiguration创建;iMIS Context是Scaffold生成的,通过
base(options)方式初始化。 - 使用
MockBehaviour.Strict时触发第二个错误,不使用则触发第一个错误。 - 仅在测试新的Enquiry Controller时失败,其他控制器测试正常。
测试代码
public EnquiryControllerTests() { _mockTrackerContext = new Mock<TrackerContext>(Mock.Of<IConfiguration>()); _mockiMISContext = new Mock<ImisContext>(new DbContextOptions<ImisContext>()); _mockActiveDirectoryHelper = new Mock<ActiveDirectoryHelper>(Mock.Of<IHttpContextAccessor>()); _mockEmailHelper = new Mock<EmailHelper>(); _enquiryController = new EnquiryController( _mockiMISContext.Object, _mockTrackerContext.Object, _mockActiveDirectoryHelper.Object, _mockEmailHelper.Object ); }
后续排查结果
尝试多种获取Context选项的方式后,测试其他控制器发现均正常运行,最终定位实际问题出在EmailHelper的Mock配置上。
内容的提问来源于stack exchange,提问作者Brandon Hale
相关产品推荐
相关产品推荐

