Rhino Mocks - 在属性中模拟对Service的方法调用

时间:2011-02-03 14:15:33

标签: unit-testing rhino-mocks

我正在尝试测试该属性从Service调用的返回中获取它的值,但是我无法模拟服务调用。

这是我的财产:

    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 个答案:

答案 0 :(得分:6)

问题是该属性是直接构造依赖项。由于这个原因,模拟服务没有被调用,实际真正的CountryService实现被调用。

解决这个问题的方法可能是在其他对象(Address?)构造函数中使用CountryService工厂(或服务本身)的构造函数注入。这样你就可以得到你的假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传递给单元测试中的其他对象构造函数