Rhinomocks DynamicMock问题

时间:2010-06-18 13:06:39

标签: rhino-mocks

我的动态模拟表现为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 

更新:我弄清楚它是什么。方法不是“虚拟”,因此无法模拟,因为无法代理非虚方法。

3 个答案:

答案 0 :(得分:0)

为什么你会有一个模拟执行你的代码?这是模拟的重点。您模拟了实际代码,因此您可以专注于测试中的1个且仅1个功能区域。

<强>更新

也许我误会了。如果你说它无意中以这种方式表现,那可能是因为使用了一个具体的类而不是一个接口。

e.g。取代

var mockProposal = _mockRepository.DynamicMock<BidProposal>();

var mockProposal = _mockRepository.DynamicMock<IBidProposal>();

答案 1 :(得分:0)

如果方法被声明为虚拟,Rhino支持对具体类的模拟方法。因此,您可以通过将virtual关键字添加到要记录的方法的每个方法声明来解决此问题。你也可以像Andy_Vulhop建议的那样提取一个接口。

答案 2 :(得分:0)

当我弄清楚它是什么时,我发布了我最初发布的答案作为问题的更新。方法不是“虚拟”,因此无法模拟,因为无法代理非虚方法。