我正在尝试测试该属性从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。我究竟做错了什么?
答案 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传递给单元测试中的其他对象构造函数