我的动态模拟表现为Parial模拟,这意味着它在调用时执行实际代码。这是我尝试的方式
var mockProposal = _mockRepository.DynamicMock<BidProposal>();
SetupResult.For(mockProposal.CreateMarketingPlan(null, null, null)).IgnoreArguments().Repeat.Once().Return(
copyPlan);
//Expect.Call(mockProposal.CreateMarketingPlan(null, null, null)).IgnoreArguments().Repeat.Once().Return(
// copyPlan);
// mockProposal.Expect(x => x.CreateMarketingPlan(null, null, null)).IgnoreArguments().Return(copyPlan).Repeat.Once();
而不仅仅是返回我期望的,它运行方法CreateMarketingPlan
中的代码这是错误:
System.NullReferenceException: Object reference not set to an instance of an object.
at Policy.Entities.MarketingPlan.SetMarketingPlanName(MarketingPlanDescription description) in MarketingPlan.cs: line 76
at Policy.Entities.MarketingPlan.set_MarketingPlanDescription(MarketingPlanDescription value) in MarketingPlan.cs: line 91
at Policy.Entities.MarketingPlan.Create(PPOBenefits ppoBenefits, MarketingPlanDescription marketingPlanDescription, MarketingPlanType marketingPlanType) in MarketingPlan.cs: line 23
at Policy.Entities.BidProposal.CreateMarketingPlan(PPOBenefits ppoBenefits, MarketingPlanDescription marketingPlanDescription, MarketingPlanType marketingPlanType) in BidProposal.cs: line 449
at Tests.Policy.Services.MarketingPlanCopyServiceTests.can_copy_MarketingPlan_with_all_options() in MarketingPlanCopyServiceTests.cs: line 32
更新:我弄清楚它是什么。方法不是“虚拟”,因此无法模拟,因为无法代理非虚方法。
答案 0 :(得分:0)
为什么你会有一个模拟执行你的代码?这是模拟的重点。您模拟了实际代码,因此您可以专注于测试中的1个且仅1个功能区域。
<强>更新强>:
也许我误会了。如果你说它无意中以这种方式表现,那可能是因为使用了一个具体的类而不是一个接口。
e.g。取代
var mockProposal = _mockRepository.DynamicMock<BidProposal>();
与
var mockProposal = _mockRepository.DynamicMock<IBidProposal>();
答案 1 :(得分:0)
如果方法被声明为虚拟,Rhino支持对具体类的模拟方法。因此,您可以通过将virtual关键字添加到要记录的方法的每个方法声明来解决此问题。你也可以像Andy_Vulhop建议的那样提取一个接口。
答案 2 :(得分:0)
当我弄清楚它是什么时,我发布了我最初发布的答案作为问题的更新。方法不是“虚拟”,因此无法模拟,因为无法代理非虚方法。