2010-04-14 138 views
2

我有一個類使用近似求解方程,評估近似值,然後細化近似(二分法),漂洗和重複直到答案出現。 爲了做到這一點,它需要去從其他複雜類中獲取各種值。它還需要重複調​​用一個方法來解決在再次運行該方法之前如何改變猜測。我已經成功地測試計算方法:我如何測試一個類,使用Rhino Mocks調用同一類中的另一個方法的方法

protected double GRPY(double royGuess, ReductionOnYield redOnYield) 
    { 
    log.LogEnter(); 
    double d1 = 0D; 
    double d2 = 0D; 
    double growth = 0D; 
    double regularPremiumInMonthm = 0D; 
    double termSurrenderValue = Convert.ToDouble(illus.GetCashInValue(redOnYield.Month) * GetFundStreamSplit(redOnYield, redOnYield.Month)); 
    for (int i = 1; i <= redOnYield.Month; i++) 
    { 
     regularPremiumInMonthm = Convert.ToDouble(illus.RegularPremium.PremiumAmount * Convert.ToDecimal(GetFundStreamSplit(redOnYield, i))); 
     d1 = (1 + royGuess); 
     d2 = (redOnYield.Month - (i - 1))/12D; 
     growth = growth + Convert.ToDouble(regularPremiumInMonthm) * Math.Pow(d1, d2); 
    } 
    double gRoy = ((termSurrenderValue - growth))/termSurrenderValue; 
    log.LogExit(); 
    return gRoy; 
    } 

但是我現在想測試它調用的計算方法猜測新的近似方法:

protected double SetNewMidPoint(double midPoint, double gStartLow, double gStartHigh, double gMidPoint, ReductionOnYield redOnYield) 
    { 
    log.LogEnter(); 

    if ((gStartLow * gStartHigh) > 0) 
    { 
    startLow = 0.001D; 
    startHigh = 0.07D; 
    midPoint = (startHigh - startLow)/2 + startLow; 
    gStartLow = GRPY(startLow, redOnYield); 
    gStartHigh = GRPY(startHigh, redOnYield); 
    gMidPoint = GRPY(midPoint, redOnYield); 

    if((gStartLow > 0) && (gStartHigh > 0)) 
    { 
    midPoint = 0.07D; 
    } 
    if ((gStartLow < 0) && (gStartHigh < 0)) 
    { 
    midPoint = 0D; 
    } 
    } 
    if((gStartLow * gMidPoint) < 0) 
    { 
    startHigh = midPoint; 
    midPoint = (startHigh - startLow)/2 + startLow; 
    } 
    if((gStartLow * gMidPoint) > 0) 
    { 
    startLow = midPoint; 
    midPoint = (startHigh - startLow)/2 + startLow; 
    } 

    log.LogExit(); 
    return midPoint; 
    } 

這是測試,但其顯然不工作。我知道我失去了一些東西(可能是一些關於犀牛製品的大型基礎)

[TestMethod()] 
    public void SetNewMidPointGStartLowTimesGStartHighGreaterThanZeroTest() 
    { 


    var quote = MockRepository.GenerateStub<EQuote>(); 
    double growthRate = 0.07; 
    quote.Request = new Request(); 

    var illustration = MockRepository.GenerateStub<Illustration>(quote, growthRate); 
    var target = MockRepository.GenerateMock<RegularPremiumReductionOnYieldCalculator_Accessor>(illustration); 

    double gStartLow = 0.1F; 
    double gStartHigh = 0.1F; 
    double gMidPoint = 0.1F; 
    double startLow = 0F; 
    double startHigh = 0F; 
    double midPoint = 0F; 

    var redOnYield = MockRepository.GenerateStub<ReductionOnYield>(1); 
    target.Stub(x => x.GRPY(0.001D, redOnYield)).Return(0.07D).Repeat.Once(); 
    target.Stub(x => x.GRPY(0.07D, redOnYield)).Return(0.07D).Repeat.Once(); 
    target.Stub(x => x.GRPY(midPoint, redOnYield)).Return(0).Repeat.Any(); 

    double actual = target.SetNewMidPoint(midPoint, gStartLow, gStartHigh, gMidPoint, redOnYield); 
    double expected = 0.07D; 
    Assert.AreEqual(expected, actual); 

    } 

回答

0

通常編寫一個測試時被證明是非常困難意味着你應該分裂,你全班學生分成小班。在你的情況下,我的第一個猜測是你的計算方法應該在一個類中,而你的近似方法(使用calculate方法的方法)應該在不同的類中。第二類將使用第一類。在你的測試中,你可以模擬測試類,這樣你就可以很容易地控制計算方法返回的內容。

相關問題