2017-08-10 4 views
0

DbSetの変更を保存するための単体テストを作成しています。基礎となるエンティティの更新機能をテストするためにDbSetを正しくロックできません

PreSchoolContext

DbSet<Student> Students{get;set;} 

PreSchoolRepository

EDIT:PreSchoolContextは、依存性注入スルー扱い、今IPreSchoolContextインスタンスであるコードは次のようになります。

public async Task<int> UpdatePreSchoolStudentAsync(Student student) 
{ 
    PreSchoolContext.Set<Student>().AddOrUpdate(student); 
    var result = await PreSchoolContext.SaveChangesAsync().ConfigureAwait(false); 
    return result;    
}  

試験方法

//Arrange 
var data = GetStudents().AsQueryable(); 
var mockSet = new Mock<DbSet<Student>>(); 
mockSet.As<IQueryable<Student>>().Setup(m => m.Provider).Returns(new TestDbAsyncQueryProvider<Student>(data.Provider)); 
mockSet.As<IQueryable<Student>>().Setup(m => m.Expression).Returns(data.Expression); 

var preSchoolContextMock = new Mock<IPreSchoolContext>(); 
preSchoolContextMock.Setup(c => c.Students).Returns(mockSet.Object); 

var repo = new PreSchoolRepository(preSchoolContextMock.Object); 

//Act 
var preSchoolStudentUpdateFlag = await repo.UpdatePreSchoolStudentAsync(data.FirstOrDefault()); 

//Assert 
preSchoolStudentUpdateFlag.ShouldNotBeNull(); 
preSchoolStudentUpdateFlag.ShouldBe(1); 

エラー

由来IDbSetタイプ 'Castle.Proxies.DbSet`1Proxy' 上公共、インスタンスメソッドAddOrUpdateを呼び出すことができません。メソッドが見つかりません。

模擬データを正しく設定するために欠けているものを理解できません。

+0

なぜ私たちは制御できないコードをテストしようとしますか? MSはリリース前にコードをテストしていたでしょう。つまり、テストしているメソッドが密接に結合されているため、それを独立してテストすると意味のある目的を果たせません。 – Nkosi

+1

テスト中のクラスが実際の 'PreSchoolContext'を' new'して使用しています。 dbcontextを模倣するために、ある種の依存性注入が必要です。 – AndrewP

+0

@AndrewP、更新されたコード。依存性注入による処理。 – Kenz

答えて

1

ここで私はDbSet<>更新機能をテストするために設計するためにいくつかの変更をした:私のコンテキストクラス下の機能を以下の

を追加しました:

public virtual void AddOrUpdateEntity<TEntity>(IProMetrixContext db, 
TEntity[] entities) where TEntity : class 
{ 
    db.Set<TEntity>().AddOrUpdate(entities); 
} 

をしてからわずかとしてUpdatePreSchoolStudentAsync(Student student)方法を変更:

public async Task<int> UpdateProMetrixRiskAsync(Student student) 
{ 
     PreSchoolContext.AddOrUpdateEntity<Student>(PreSchoolContext, student); //This one resolved issue of unit test and works fine in real scenario too. 
     var result = await PreSchoolContext.SaveChangesAsync().ConfigureAwait(false); 
     return result; 
} 

ここを参照してくださいLINK

:誰かが同じ提案をしている場合は投稿してください。

関連する問題