1
votes

I am trying to test that the property gets it's value from the return of a Service call, but I am having trouble mocking the service call.

Here is my property:

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

Here is my attempt at testing this:

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

I keep getting an error because the real countryService is being called, not my mock. I am using MsTest and Rhino Mocks. What am I doing wrong?

1

1 Answers

6
votes

You problem is that the property is directly constructing the dependency. Due to this the mock service is not getting called, the actual real CountryService implementation is getting called.

A way around this might be to utilize constructor injection of a CountryService factory (or the service itself) in the other objects (Address?) constructor. This way you could get your fake CountryService (the mock) to be returned and be the one called by the method

For example:

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

You would need to then pass the mocked ICountryService into the other objects constructor in your unit test