あなたが説明する状況は、単体テストのアンチパターンの 1 つです。単体テストは独立している必要があり、実行される順序に依存するべきではありません。詳細については、次のxUnit パターン Web サイトを参照してください。
また、両方の単体テストにはアサートがないため、合格かどうかを証明できません。
また、それらはデータベース、つまり外部リソースに依存しているため、ユニットではなく統合テストです。
したがって、私のアドバイスはそれらを書き直すことです:
- モック オブジェクトを使用してデータベースから切り離す
InsertInfo
情報を挿入し、モックを使用して、引数を使用した適切な挿入呼び出しが実行されたことを確認する必要があります
GetInfo
偽物を返すモックで動作し、record
正常に動作することを確認する必要があります
例
注: * B/L をデータベース操作から分離する必要があります… * … そして、ソリューションについていくつかの仮定を立てます
// Repository incapsulates work with Database
public abstract class Repository<T>
where T : class
{
public abstract void Save(T entity);
public abstract IEnumerable<T> GetAll();
}
// Class under Test
public class SomeRule
{
private readonly Repository<Info> repository;
public SomeRule(Repository<Info> repository)
{
this.repository = repository;
}
public int InsertInfoToDb(Info oInfo)
{
repository.Save(oInfo);
return oInfo.Id;
}
public Info GetInfoFromDb(int id)
{
return repository.GetAll().Single(info => info.Id == id);
}
}
// Actual unittests
[Test]
public void SomeRule_InsertInfo_WasInserted() // ex. InsertInfo
{
// Arrange
Info oInfo = new Info();
oInfo.Desc = "Some Description here !!!";
var repositoryMock = MockRepository.GenerateStrictMock<Repository<Info>>();
repositoryMock.Expect(m => m.Save(Arg<Info>.Is.NotNull));
// Act
var savedrecordid = new SomeRule(repositoryMock).InsertInfoToDb(oInfo);
// Assert
repositoryMock.VerifyAllExpectations();
}
[Test]
public void SomeRule_GetInfo_ReciveCorrectInfo() // ex. GetInfo
{
// Arrange
var expectedId = 1;
var expectedInfo = new Info { Id = expectedId, Desc = "Something" };
var repositoryMock = MockRepository.GenerateStrictMock<Repository<Info>>();
repositoryMock.Expect(m => m.GetAll()).Return(new [] { expectedInfo }.AsEnumerable());
// Act
Info receivedInfo = new SomeRule(repositoryMock).GetInfoFromDb(expectedId);
// Assert
repositoryMock.VerifyAllExpectations();
Assert.That(receivedInfo, Is.Not.Null.And.SameAs(expectedInfo));
}
ps: 完全なサンプルはこちら