我使用的是EF4、Microsoft.Entity.CTP和最新的最新最新版本。我正在尝试创建一个通用的存储库类,并使用MOQ对DBContext进行moq。每当我运行我的moq测试时,我在this.context.Set().Add(Entity)上得到"object reference not set to an instance of an object“;我不明白为什么。代码在没有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();发布于 2010-10-30 23:38:01
您需要模拟Set后面的list实现。我不在自动取款机,但我知道它是个IDbSet。
发布于 2012-07-29 11:49:30
首先将您的代码定义从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为空的错误。
微软需要提供一个很好的例子来说明该怎么做。他们已经完成了一半,提供了用于模拟的公共接口,但我仍然需要更多的帮助。
乔
https://stackoverflow.com/questions/4053198
复制相似问题