同じ試験スイートに様々な実装のリポジトリインタフェース
-
09-06-2019 - |
質問
を作り続けています。少しゃwebアプリケーションにC#のロブ-コネリー氏のAsp.net MVC店頭.
見てそのリポジトリインタフェースでIFooRepository、方法、
IQueryable<Foo> GetFoo();
void PersistFoo(Foo foo);
ってこれらのコールバックメソッド:ISqlFooRepository,IFileFooRepostory、IMockFooRepository.
また試験を実施。うん、なので仕方ないのは同じテストケースに対しこれらの実装は、グリーンティックのための各試験の継承の各インタフェースタイプです。
例えば
[TestMethod]
Public void GetFoo_NotNull_Test()
{
IFooRepository repository = GetRepository();
var results = repository. GetFoo();
Assert.IsNotNull(results);
}
私は、この試験方法を実行する、バリエーション環境にすることを可能にするく三つの異なる種類のリポジトリ現在私は三つのカットを貼り付け試験授業の実施のヘルパーの方法IFooRepository GetRepository();明らかに、この臭い
しかし、できませんで削除複製を統合し、カットを貼り付け方法、その必要性、公印として試験するための試験を行います。.
これまでのMicrosoftテスティングフレームワーク、望に滞在すればできます。が提案していますと、MBUnitものである。
解決
を抽象クラスを含むコンクリートのバージョンの試験および抽象GetRepositoryを返しますIFooRepository.をつくることだけを目的とし授業から得られる抽象クラスの実装GetRepositoryうを返します適切なIFooRepositoryの実装です。追加すべての授業への試験スイートできます。
できる選択的には試験のためのプロバイダーは使用をご検討MbUnit'[FixtureCategory]'属性をcategorise検査-提案カテゴリーコーポレート-ガバナンスの変化''遅''db'"重要"と"重要で、最後の二つは冗談-正直!)
他のヒント
にMbUnitされることもありますので、使用できるのRowTest属性を指定パラメータおよ。
[RowTest]
[Row(new ThisRepository())]
[Row(new ThatRepository())]
Public void GetFoo_NotNull_Test(IFooRepository repository)
{
var results = repository.GetFoo();
Assert.IsNotNull(results);
}
していれば3コピーや貼り付け試験方法に対応することができるでしょうrefactor(抽出方法ではなく、複製.
すなわちこうした点にご留意ください。
private IRepository GetRepository(RepositoryType repositoryType)
{
switch (repositoryType)
{
case RepositoryType.Sql:
// return a SQL repository
case RepositoryType.Mock:
// return a mock repository
// etc
}
}
private void TestGetFooNotNull(RepositoryType repositoryType)
{
IFooRepository repository = GetRepository(repositoryType);
var results = repository.GetFoo();
Assert.IsNotNull(results);
}
[TestMethod]
public void GetFoo_NotNull_Sql()
{
this.TestGetFooNotNull(RepositoryType.Sql);
}
[TestMethod]
public void GetFoo_NotNull_File()
{
this.TestGetFooNotNull(RepositoryType.File);
}
[TestMethod]
public void GetFoo_NotNull_Mock()
{
this.TestGetFooNotNull(RepositoryType.Mock);
}
[TestMethod]
public void GetFoo_NotNull_Test_ForFile()
{
GetFoo_NotNull(new FileRepository().GetRepository());
}
[TestMethod]
public void GetFoo_NotNull_Test_ForSql()
{
GetFoo_NotNull(new SqlRepository().GetRepository());
}
private void GetFoo_NotNull(IFooRepository repository)
{
var results = repository. GetFoo();
Assert.IsNotNull(results);
}
したがって、あるプロの方たちでも腹筋は割れ:
1)実験の一つにライナーに電話を普通の方法で回答リック、またHallgrim)
2)利用MBUnitのRowTest特徴を自動化すること(解答ジLimjap).また利用enumここでは、例えば
[RowTest]
[Row(RepositoryType.Sql)]
[Row(RepositoryType.Mock)]
public void TestGetFooNotNull(RepositoryType repositoryType)
{
IFooRepository repository = GetRepository(repositoryType);
var results = repository.GetFoo();
Assert.IsNotNull(results);
}
3)使用基底クラスで回答するbelugabob
私はサンプルはこうした考えに基づき
public abstract class TestBase
{
protected int foo = 0;
[TestMethod]
public void TestUnderTen()
{
Assert.IsTrue(foo < 10);
}
[TestMethod]
public void TestOver2()
{
Assert.IsTrue(foo > 2);
}
}
[TestClass]
public class TestA: TestBase
{
public TestA()
{
foo = 4;
}
}
[TestClass]
public class TestB: TestBase
{
public TestB()
{
foo = 6;
}
}
この四つの通過試験を実施します。
Upsidesの3:
1)少なくとも余分なコードでは、少なくとも維持
2)少なくともタイピングプラグインを新しいリポジトリに必要とされるのかが一つの場所とは異なります。
マイナス面は:
1)以下の柔軟性な試験に対している場合、プロバイダにする必要がある
2)難を読み込みます。