Использование Rhino Mocks для имитации вызова частных объектов - PullRequest
1 голос
/ 20 октября 2011

Так что я просто привыкаю к ​​вещам. У меня есть эта личная переменная здесь:

private CoreDataContext _coreDataManager;

В этом классе:

public class RatesControlReport
        : Chatham.Panda.Batch.ProcessDefinition.BatchProcess

В этом классе есть метод void, который я хочу протестировать и который называется CheckSwaptionVols(DateTime runDate).

В первой части моего теста я могу создать основной класс:

RatesControlReport ratesControlReportProcess;
            ratesControlReportProcess = new RatesControlReport();

И в основном я хочу сделать этот звонок:

ratesControlReportProcess.CheckSwaptionVols(DateTime.Now);

Однако этот метод использует закрытую переменную следующим образом:

System.Data.Linq.ISingleResult<CheckSwaptionVols> swaptionStatusResult = _coreDataManager.CheckSwaptionVols(this._runDate);

Я бы хотел иметь возможность вместо этого передавать смоделированную версию этой переменной и возвращать мой собственный указанный System.Data.Linq.ISingleResult<CheckSwaptionVols>, чтобы тест мог продолжаться без зависимости от БД.

Как бы я это сделал?

1 Ответ

5 голосов
/ 20 октября 2011

Ну, это зависит от того, где вы создаете экземпляр CoreDataContext. Если это построено в статическом контексте или в конструкторе, на самом деле нет способа создать для него макет. Вот почему обычно считается плохой практикой создавать зависимости внутри объекта. Что вам нужно сделать, это предоставить какой-то метод внедрения зависимости. Это может быть так же просто, как перегруженный конструктор:

public RatesControlReport(CoreDataContext context)
{
    _coreDataManager = context;
}

... или даже внутренний метод, если вы в отчаянии:

internal void InjectContext(CoreDataContext context)
{
    _coreDataManager = context;
}

В целом, однако, рекомендуется всегда предоставлять объект CodeDataContext при создании объекта RatesControlReport. Это отделит доступ к данным от бизнес-логики, что позволит вам более эффективно выполнять модульное тестирование обоих классов.

...