使用Rhino Mocks模拟IObjectSet <t> </t>

时间:2011-03-06 20:37:00

标签: c# entity-framework-4 rhino-mocks

有没有办法使用Rhino Mocks为IObjectSet<T>生成Stub?

之后的内容类似于以下代码:

var context = MockRepository.GenerateMock <IContext>();
//generate stub
var mockProjectObjectSet = MockRepository.GenerateStub<IObjectSet<Project>>();
TestObjectSets.GenerateFakeProjectList(mockProjectObjectSet);
context.Expect(p => p.Projects).Return(mockProjectObjectSet);
var projectRepository = new ProjectRepository(context);

GenerateFakeProjectList静态助手方法中,我只是创建指定类型的对象,并通过AddObject上的IObjectSet方法将它们添加到存根:

public static IObjectSet<Project> GenerateFakeProjectList(IObjectSet<Project> projectsObjectSet)
{     
   projectsObjectSet.AddObject(new Project()
   {
     Categories = null,
     DateCreated = DateTime.Now.AddDays(-10),
    .......

3 个答案:

答案 0 :(得分:6)

我知道我参加这个派对已经迟到了,但这是我以前用过的IObjectSet<T>的简单实现。我忘记了从哪里得到它:

public class MockObjectSet<T> : IObjectSet<T> where T : class {
        readonly List<T> _container = new List<T>();

        public void AddObject(T entity) {
            _container.Add(entity);
        }

        public void Attach(T entity) {
            _container.Add(entity);
        }

        public void DeleteObject(T entity) {
            _container.Remove(entity);
        }

        public void Detach(T entity) {
            _container.Remove(entity);
        }

        public IEnumerator<T> GetEnumerator() {
            return _container.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator() {
            return _container.GetEnumerator();
        }

        public Type ElementType {
            get { return typeof(T); }
        }

        public System.Linq.Expressions.Expression Expression {
            get { return _container.AsQueryable<T>().Expression; }
        }

        public IQueryProvider Provider {
            get { return _container.AsQueryable<T>().Provider; }
        }
    }

答案 1 :(得分:2)

我会使用一个具体的实例,或一个简单的假。该接口具有少量方法,并且实现看起来微不足道。模拟该接口只会增加不必要的复杂性。

答案 2 :(得分:1)

由于你在嘲笑一个界面,所以没有实际的代码。只需为您的界面设置一个存根,然后将Projects属性存根以返回您想要的内容(我假设Projects是一个属性,但您没有包含Project类的定义。)

这样的事情应该有效:

var stubSet = MockRepository.GenerateStub<IObjectSet<Project>>();
stubSet.Stub(s => s.Projects).Return(new[]
                                                {
                                                    new Project {Categories = null},
                                                    new Project {Categories = "abc"}
                                                });