2017-03-06 3 views
1

Nunitを使用して、コントローラからDBからレコードを削除するメソッドをテストしています。すべて正常に動作し、チェックするとレコードが削除されます。単位テスト削除、レコードがデータベース内で削除されても返されます

db.AssesorMaxProjectLoad.Find(previousLoad.ID) 

は、依然として削除された値を返し、テストに失敗します。

テスト:

[Test] 
public void AssesorMaxProjectLoadsDeleteLoad() 
{ 
    var previousLoad = db.AssesorMaxProjectLoad.Where(t => t.AssesorID == testAssesor3ID).FirstOrDefault(t => t.TaskGroupID == taskGroupID); 
    var result = controller.DeleteConfirmed(previousLoad.ID) as ViewResultBase; 
    var newProjectLoad = db.AssesorMaxProjectLoad.Find(previousLoad.ID).MaxAssignedProjectLoad; 
    Assert.AreEqual(null, newProjectLoad); 
} 

コントローラメソッドのテスト:

[HttpPost, ActionName("Delete")] 
[ValidateAntiForgeryToken] 
public ActionResult DeleteConfirmed(int id) 
{ 
    AssesorMaxProjectLoad assesorMaxProjectLoad = db.AssesorMaxProjectLoad.Find(id); 
    db.AssesorMaxProjectLoad.Remove(assesorMaxProjectLoad); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "AssesorMaxProjectLoads", new { id = assesorMaxProjectLoad.TaskGroupID }); 
} 

が起こっていただきましたか私が何をしないのですか?私はそれがデータベースになくなったときにどのように返されるのか分かりません。

+1

あなたのテストでdbはどこから来ますか?異なるコンテキストインスタンスとエンティティがキャッシュされている可能性はありますか? –

+0

これは統合テストですか? – Nkosi

+0

はい、それは確かに統合テストです – Spitfire5793

答えて

2

ユニットテストのDbContextがコントローラメソッドのDbContextから切断されているためです。

DbContextという2つのインスタンスがある場合はどうなりますか。データベース内のレコードを削除すると、その変更は他のコンテキストに公開されないので、レコードの検索を行うと、ユニットテストコンテキストは変更されたことを知らず、元の値を返します。

あなたは、あなたが最新のデータを見ていることを確認するために、コントローラのメソッドを実行した後、あなたのユニットテストDbContextを再作成する必要があります。

または、DbContextコールを完全に嘲笑してください。

+0

どのように私はそれを逃した可能性があります、それはまさに問題です。どうもありがとうございます – Spitfire5793

+0

@Steve - よく目を覚まし、+1。 – Brian

+0

@ブライアンオハイオ州は私を信じて、それは難しい知識です。 – Steve

関連する問題