【发布时间】:2014-02-04 19:20:18
【问题描述】:
/*************************** UPDATED *****************/
此后,我尝试继承 EFContextProvider,以便可以将 Context 作为虚拟属性提供以进行测试,并且可以将上下文提供程序注入到我的存储库中。这种新模式确实适用于 IOC,但单元测试仍然失败并出现以下错误:
测试方法 MyProj.Infrastructure.MyItemTests.The_MyRepository_MyItems_Should.Return_A_IQuerable_List_of_MyItem_Instances 抛出异常: System.NullReferenceException:对象引用未设置为对象的实例
/************ * 更新 #2 *******/ 添加了存储库,因此我的示例代码更加清晰。
/********************** THE NEW PATTERN TO SUPPORT IOC ******************************/
public interface IMyDbContextProvider {
MyDbContext Context { get; }
string Metadata { get; }
SaveResult SaveChanges( JObject saveBundle );
}
public class MyDbContext : BaseContext<MyDbContext>, IMyDbContext {
public virtual DbSet<MyItem> MyItem{ get; set; }
protected override void OnModelCreating( DbModelBuilder modelBuilder ) {
// Use singular table names
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>( );
// Disable proxy creation and lazy loading; not wanted in this service context.
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
modelBuilder.Configurations.Add(new MyItemMap());
}
}
public class MyContextProvider : EFContextProvider <MyDBContext> , IMyContextProvider {
public MyContextProvider( ) {
}
public virtual MyDbContext Context {
get { return base.Context; }
}
public new string Metadata {
get {
return base.Metadata();
}
}
public virtual SaveResult SaveChanges( JObject saveBundle ) {
return base.SaveChanges( saveBundle );
}
protected override bool BeforeSaveEntity( EntityInfo entityInfo ) {
return base.BeforeSaveEntity( entityInfo );
}
}
public interface IMyRepository {
string Metadata { get; }
IQueryable<MyItem> GetMyItems{ get; }
SaveResult SaveChanges( JObject saveBundle );
}
public class MyRepository : IMyRepository {
private readonly IMyContextProvider _myContextProvider;
public MyRepository (IMyContextProvider myContextProvider ) {
_myContextProvider = myContextProvider;
}
public MyDbContext Context {
get {
return _myContextProvider.Context;
}
}
public string Metadata {
get {
return _myContextProvider.Metadata;
}
}
public SaveResult SaveChanges(JObject saveBundle) {
return _myContextProvider.SaveChanges( saveBundle );
}
public IQueryable<MyItem> GetMyItems() {
get {
return Context.MyItems;
}
}
}
/**********************My UNIT TEST SET UP FUNCTION AND TEST FUNCTION****/
[TestInitialize()]
public void SetUp( ) {
_querableMyItemData = GetQueryableMyItemData( ); //Returns a list of MyItems.AsQueryable()
_mockMyContextProvider = new Mock<IMyContextProvider>( );
_mockMyItemSet = new Mock<DbSet<MyItem>>( );
_mockMyItemSet.As<IQueryable<MyItem>>( ).Setup( m => m.Provider ).Returns( _querableMyItemData.Provider );
_mockMyItemSet.As<IQueryable<MyItem>>( ).Setup( m => m.Expression ).Returns( _querableMyItemData.Expression );
_mockMyItemSet.As<IQueryable<MyItem>>( ).Setup( m => m.ElementType ).Returns( _querableMyItemData.ElementType );
_mockMyItemSet.As<IQueryable<MyItem>>( ).Setup( m => m.GetEnumerator( ) ).Returns( _querableMyItemData.GetEnumerator( ) );
_mockMyContextProvider.Setup( m => m.Context.Units ).Returns( _mockUnitSet.Object );
}
[TestMethod]
public void Return_A_IQuerable_List_of_MyItem_Instances( ) {
var expectedType = typeof( IEnumerable<MyItem> );
var myRepository = new MyRepository( _mockMyContextProvider.Object );
var resultingMyItems = myRepository.GetMyItems();
Assert.IsInstanceOfType( resultingMyItems, expectedType );
}
【问题讨论】:
标签: c# dependency-injection inversion-of-control breeze repository