【问题标题】:Rhino Mocks - Mock a method call to Service inside a propertyRhino Mocks - 在属性内模拟对 Service 的方法调用
【发布时间】:2011-02-03 14:15:32
【问题描述】:

我正在尝试测试该属性是否从服务调用的返回中获取它的值,但是我在模拟服务调用时遇到了麻烦。

这是我的财产:

    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。我究竟做错了什么?

【问题讨论】:

    标签: unit-testing rhino-mocks


    【解决方案1】:

    你的问题是属性直接构建依赖。因此没有调用模拟服务,而是调用了实际的 CountryService 实现。

    解决此问题的一种方法可能是在其他对象(地址?)构造函数中利用 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 传递到单元测试中的其他对象构造函数中

    【讨论】:

    • 问题是我也在调用一个状态服务来获取 IState 属性,并且可能还有其他的。我不想依靠将这些对象传递给类来获取对象。
    • 然后你可以做的是利用一个 ObjectFactory 类,它可以让你做 - objectFactory.GetInstance() 或 objectFactory.GetInstance()... 这样你只有一个注入到类中的依赖项 - 在内部,ObjectFactory 可以利用 IOC 容器或您想要构造它的对象的任何机制,只要它允许您将这些依赖项交换出来以进行单元测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多