Как издеваться над этим значением с помощью Rhino Mocks

Вот метод, который я пытаюсь проверить:

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?

Это действительный тест? Или я ошибаюсь?


person Bernard    schedule 15.04.2010    source источник


Ответы (2)


без дополнительной информации о ваших объектах сложно сказать, но вы хотите что-то вроде:

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);
person Andrew Bullock    schedule 15.04.2010

redOnYield - это объект, возвращаемый в результате итерации ReductionsOnYield. Я не понимаю, откуда это взялось. Если мы предполагаем, что это виртуальное свойство, вам нужно создать коллекцию фиктивных объектов ReductionOnYield и заглушить ReductionsOnYield, чтобы вернуть вашу фиктивную коллекцию (или, чтобы упростить тестирование, попросите CalculateReductionOnYield принять IEnumerable и работать с этой коллекцией. ).

Как только вы решите проблему с ReductionsOnYield, ответ Эндрю о сокращении свойств приведет вас туда, где вы хотите быть. Конечно, это предполагает, что FundStream является виртуальным (так что его можно имитировать / заглушить), а также GetFundStreamValue и FundStreamMonths RegularPremiumFundStream.

person PatrickSteele    schedule 16.04.2010