2010-10-29 10 views
1

Я использую EF4, Microsoft.Entity.CTP и новейшее MOQ. Я пытаюсь создать общий класс репозитория и moq DBContext с помощью MOQ. Всякий раз, когда я запускаю свой тест moq, я получаю «ссылка на объект, не установленную на экземпляр объекта» на this.context.Set(). Add (entity); и я не понимаю, почему. Код работает нормально без мока.Entity Framework 4, MOQ,

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class 
{ 
    private IContext context; 

    public GenericRepository(IContext context) 
    { 
     this.context = context; 
    } 

    public IList<TEntity> List 
    { 
     get { return context.Set<TEntity>().ToList(); } 
    } 

    public void Create(TEntity entity) 
    { 
     this.context.Set<TEntity>().Add(entity); 
     this.context.SaveChanges(); 
    } 
} 

var mock = new Mock<IContext>(); 
GenericRepository<Product> producRepository = new GenericRepository<Product>(mock.Object); 

mock.Setup(x => x.Product.Add(productType)); 
mock.Setup(x => x.SaveChanges()); 

productRepository.Create(product); 
mock.VerifyAll(); 

ответ

0

Вам необходимо высмеять реализацию списка за Set. Я не на вычислительном банкомате, но iirc это IDbSet.

+0

привет, спасибо за ответ. На объекте DbContext это конкретный класс. public DbSet Set () где TEntity: class ;. Как я могу издеваться над этим? –

+0

DbSet не является запечатанным классом, поэтому вы можете выполнить его, как вы бы, интерфейс. –

0

Измените свои первые определения определения с DbSet на IDbSet, а затем вы можете имитировать их. http://blogs.msdn.com/b/efdesign/archive/2010/06/21/productivity-improvements-for-the-entity-framework.aspx

Я рассматриваю возможность изменения моего файла DbContext.tt для генерации IDbSet вместо DbSet, но только после того, как я получу издевательство над работой.

Я не говорю, что это облегчает остальную работу, но она заставит вас пройти мимо одной проблемы. Мне нужна помощь в том, что делать после изменения моих первых определений кода на основе интерфейсов EF DbContext. Например, я создаю экземпляры своих объектов DbSet и добавляю их.

Mock<IPosManContext> posManContext; 

posManContext.Object.Set(typeof(note_template)); 

posManContext.Object.note_template.Add(
    new note_template() 
    { 
     note_template_id = 1, 
     act_flag = "Y", 
     desc_text = "Monday Monday", 
     last_update_dtm = now, 
     last_update_user_id = "hsimpson", 
    }); 

Но я получаю сообщение об ошибке, которое DbSet равно null.

Microsoft должен предоставить хороший пример того, что делать. Они прошли половину пути, предоставив общедоступные интерфейсы для насмешек, но мне все еще нужна дополнительная помощь.

Joe