2010-04-15 83 views
0

这里这个值的方法,我想测试:如何用嘲弄犀牛制品

public override void CalculateReductionOnYield() 
    { 
     log.LogEnter(); 
     if (illus.RpFundStreams.Count <= 0) 
     { 
      throw new InvalidDataException("No regular premium fund streams which are required in order to calculate reduction on yield"); 
     } 
     // Add the individual ReductionOnYield classes to the collection.) 
     foreach (RegularPremiumFundStream fs in illus.RpFundStreams) 
     { 
      foreach (int i in ReductionOnYieldMonths) 
      { 
       ReductionOnYield roy = new ReductionOnYield(i); 
       roy.FundStream = fs; 
       ReductionsOnYield.Add(roy); 
      } 
      foreach (ReductionOnYield redOnYield in ReductionsOnYield) 
      { 
       if (redOnYield.Month == 0 || illus.RegularPremiumInPlanCurrency == 0M) 
       { 
        redOnYield.Reduction = 0M; 
       } 
       else 
       { 
        double[] regPremiums = new double[redOnYield.Month + 1]; 
        for (int i = 1; i <= redOnYield.Month; i++) 
        { 
         regPremiums[i - 1] = Convert.ToDouble(-1*redOnYield.FundStream.FundStreamMonths[i].ValRegularPremium); 
        } 
        regPremiums[redOnYield.Month] = Convert.ToDouble(redOnYield.FundStream.GetFundStreamValue(redOnYield.Month)); 
        redOnYield.Reduction = Convert.ToDecimal(Math.Pow((1 + Financial.IRR(ref regPremiums, 0.001D)), 12) - 1); 
       } 
      } 
     } 

如何嘲笑所有必需的类测试redOnYield.Reduction的价值,以确保它工作正常吗?

例如我如何模拟redOnYield.FundStream.GetFundStreamValue(redOnYield.Month)和redOnYield.FundStream.FundStreamMonths [i] .ValRegularPremium?

这是一个有效的测试吗?还是我以错误的方式去做这件事?

回答

0

不会对你的对象更多信息很难说,但你想要的东西,如:

var fundStream = MockRepository.GenerateStub<TFundStream>(); 
fundStream.Stub(f => f.GetFundStreamValue(60)).Return(220000M); 

var redOnYeild = MockRepository.GenerateStub<TRedOnYeild>(); 
redOnYeild.Stub(r => r.FundStream).Return(fundStream); 
+0

在问题中添加了源代码... – Bernard 2010-04-16 10:25:17

0

redOnYield是一个对象从迭代ReductionsOnYield返回。我不知道这是从哪里来的。如果我们假设它是一个虚拟属性,那么您将需要创建一个模拟ReductionOnYield对象集合并将ReductionsOnYield对象存回以返回您的模拟集合(或者为了使测试更容易,让CalculateReductionOnYield接受一个I​​Enumerable并对该集合进行操作)。

一旦你解决了ReductionsOnYield问题,安德鲁对这些属性的反应就会让你置身于你想要的位置。当然,这假设FundStream是虚拟的(因此它可以被模拟/存根)以及RegularPremiumFundStream的GetFundStreamValue和FundStreamMonths。