2010-04-15 43 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。