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);
}