Entity Framework の単体テストに関するいくつかの質問と回答を読んだ後、統合テストのための単体テストを控えることにしました。私は、EF コンテキストとのやり取りは「プライベート」アクションであるという哲学を取り入れています。これは、サービスとは別に単体テストを行う必要がなく、簡単かつ正確に嘲笑することができないためです。
注: 私の例では、EF5 を使用しています。
まず、ユーザーを作成するためのサービス メソッドがあります。
void CreateUser(string username, string password);
テスト アセンブリには、データベース (EF Code First) とテスト データを作成する SetUpFixture (テスト実行用に 1 回のみ) があります。
[SetUpFixture]
public class SetUpFixture
{
[SetUp]
public void SetUp()
{
using (var context = new MyDbContext())
{
Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());
// Set up a bunch of initial data and commit
}
}
}
次に、各テストの前に、TestFixtureSetup メソッドが実行され、DB コンテキストのインスタンスが作成されます。これは、(各テストの後) 破棄されるとロールバックするように設定され、サービスのインスタンスも作成されます。
[TestFixtureSetUp]
public virtual void TestFixtureSetUp()
{
_context = new MyContext(rollbackOnDispose: true);
UserService = new SignupService(_context);
}
[TestFixtureTearDown]
public virtual void TestFixtureTearDown()
{
Context.Dispose();
}
最後に、有効なデータが渡されたことを確認するための実際の統合テスト、ユーザー名のレコードが作成されたことを確認します (ここに問題があります)。
[Test]
public void ValidDataShouldResultInNewRecordWithUsername()
{
SignupService.CreateUser("myuser", "fakepassword");
var q = from user in Context.Users
where user.Username == "myuser"
select user;
var actualUser = q.Single();
Assert.AreEqual("myuser", actualUser.Username);
}
ここに私の質問があります:
1) まず第一に、これは EF に依存するサービスをテストする方法でもありますか? いくつかのアプローチがあることは知っていますが、このアプローチに異常がないことを確認したいだけです。
2) 2 番目に、データがコミットされる前に、サービス メソッド (CreateUser) が本来の動作を行ったことを確認するにはどうすればよいですか (コミットしたくないため、データベースの状態が初期化前の状態のままになるようにします)。各テスト)?上記のテストのクエリは、まだコミットされていないため、データを返しません。