私の理解が正しければ、あなたは SUT (Subject Under Test) を完全には特定していません。
いずれにせよ、への呼び出しをDataContext
リポジトリにラップすることをお勧めします。リポジトリはデータベースとの通信を担当します。このアプローチに従うと、作業が簡単になります。
例でそれを明確にし、最後に、テスト可能なコードを書くのに役立ついくつかのリンクをお勧めします. (私はいつもこれを言いますが、もう一度言います。テストを書くのは簡単です。真の努力は、クリーンでテスト可能なコードを書くことに費やされなければなりません)
public interface IMyRepository
{
void ChangeEmail(int employeeId, string newEmail);
}
public class MyRepository : IMyRepository
{
private MyDataContext context;
public MyRepository(MyDataContext context)
{
this.context = context;
}
public void ChangeEmail(int employeeId, string newEmail)
{
//save your email using your context
}
}
ここで、コンシューマー コードにリポジトリを挿入します。
public class MyCommand
{
public MyCommand(IMyRepository myRepository)
...
public void ChangeEmail(int employeeId, string newEmail)
{
//adding condition just to clarify how to test
if(this.AllowChangeEmail(employeeId))
{
this.myRepository.ChangeEmail(employeeId, newEmail);
}
else
{
throw new DomainException("this should not happen");
}
}
...
}
の使用を分離しましたDataContext
。ドメイン コードの観点からは、DataContext
は存在しません。ドメインが認識している唯一のコードは です。IMyRepository
これはインターフェイスであるため、ドメインをリファクタリングすることなく、アプリケーションの動作を変更するプロバイダを簡単に変更できます。コード
まだテストについて話していないことに気がついたら、なぜですか? 私が言ったように、最初にすべきことは、クリーンでテスト可能なコードを書くことです (誤解しないでください。TDD に従う必要があります。つまり、テストを最初に作成する必要があります。私はデモとしてこのアプローチに従っています)。このコードがあれば、アプリケーションのロジックをテストするのがいかに簡単か見てみましょう。明確にするために手動でスタブを作成しますが、実際のコードでは、 AutoFixture、FluentAssertions、およびMoqIMyRepository
などのツールを使用して、代わりに自動モック オブジェクトを使用する必要があります。
public class MyFakeProvider : IMyRepository
{
public void ChangeEmail(int employeeId, string newEmail)
{
//write some assert here indicating the method was called
}
}
[Test]
public void MyTest()
{
var myMock = new MyFakeProvider();
var sut = new MyCommand(myMock);
sut.Invoking(x => x.ChangeEmail(3, "my@email.com")).ShouldNotThrow();
}
これらのリンクは、テスト可能なコードを書く:
http://misko.hevery.com/code-reviewers-guide/
http://misko.hevery.com/attachments/Guide-Writing%20Testable%20Code.pdf
http://misko.hevery.com/presentations/
http://www.youtube.com/watch?v=wEhu57pih5w&feature=player_embedded
http://www.youtube.com/watch?v=RlfLCWKxHJ0&feature=player_embedded
http://www.youtube.com/watch?v=-FRm3VPhseI&feature=player_embedded
http://www.youtube.com/watch?v=4F72VULWFvc&feature=player_embedded