是否可以模拟已存在的对象的一部分?

时间:2009-07-29 18:35:19

标签: rhino-mocks

有没有办法根据现有对象创建模拟对象?例如,在单元测试ASP.NET MVC应用程序时,我经常遇到模拟存储库方法的问题(如GetAll)。通常我想让这个方法返回一些测试数据,如:

    private List<Country> CreateCountries()
    {
        return new List<Country> { 
                                new Country("Australia", "AU", "AUS"),
                                new Country("Canada", "CA", "CAN"),
                                ...
                                 };
    }

我的实体对象都来自一个具有Id属性的PersistedEntity基类,但它只能由NHibernate设置,所以当我从头创建这些对象时,它们的Id = 0。这是有问题的单元测试,因为它们为控制器提供了所有Id都设置为0的不切实际的实体列表。

我真的希望能够通过执行类似

的操作来设置这些对象的ID
new Country("United States", "US", "USA").SetID<Country>(3); *

其中SetIDPersistedEntity上的扩展方法:

    public static T SetID<T>(this T entity, int id) where T : PersistedEntity
    {
        var mocks = Mocker.Current;

        // Some kind of magic happens here that creates a mocked version of
        // entity (entity2), which has the same values as the original entity
        // object but allows us to set up new expectations on it like...

        Expect.Call(entity2.Id).Return(id);

        return entity2;
    }

任何人都知道Rhino Mocks中是否有类似神奇的东西?

*我怀疑有必要将此方法设为通用,但如果没有,则更好。

1 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,您应该能够像下面这样做:

var country = MockRepository.GenerateMock<Country>("Australia", "AU", "AUS");

...

country.Stub(c => c.Id).return(5); // whatever arbitrary id you want to give it

...

return new List<Country> { country, ... };

我在这里假设Country没有被密封,即RhinoMocks能够生成该类的模拟。