Rhino Mocks - макет вызова метода Service внутри свойства - PullRequest
1 голос
/ 03 февраля 2011

Я пытаюсь проверить, что свойство получает свое значение после возврата вызова службы, но у меня возникают проблемы с насмешкой над вызовом службы.

Вот моя собственность:

    public ICountry Country
    {
        get
        {
            if (_country == null)
            {
                ICountryService countryService = new CountryService();
                _country = countryService.GetCountryForCountryId(_address.CountryId);
            }
            return _country;
        }
    }

Вот моя попытка проверить это:

    [TestMethod]
    public void Country_should_return_Country_from_CountryService()
    {
        const string countryId = "US";
        _address.CountryId = countryId;

        var address = MockRepository.GenerateStub<Address>(_address);

        var country = MockRepository.GenerateMock<ICountry>();
        var countryService = MockRepository.GenerateStub<ICountryService>();

        countryService.Stub(x => x.GetCountryForCountryId(countryId)).IgnoreArguments().Return(country);

        Assert.AreEqual(address.Country, country);
    }

Я продолжаю получать сообщение об ошибке, потому что вызывается реальная служба CountryService, а не мое издевательство. Я использую MsTest и Rhino Mocks. Что я делаю неправильно?

1 Ответ

6 голосов
/ 03 февраля 2011

Ваша проблема в том, что свойство напрямую создает зависимость. Из-за этого фиктивная служба не вызывается, вызывается реальная реальная реализация CountryService.

Обходным путем может быть использование внедрения конструктора фабрики CountryService (или самой службы) в конструктор других объектов (Address?). Таким образом, вы можете получить ваш поддельный CountryService (макет), который будет возвращен и вызван методом

Например:

private ICountryService _countryService;

//constructor
public OuterObject(ICountryService countryService)
{
    //maybe guard clause
    _countryService = countryService;
}


public ICountry Country
{
    get
    {
        if (_country == null)
        {
            _country = _countryService.GetCountryForCountryId(_address.CountryId);
        }
        return _country;
    }
}

Затем вам нужно будет передать имитированный ICountryService в конструктор других объектов в вашем модульном тесте

...