1

単体テストの場合、最初にレコードをデータベースに挿入し、2番目にデータを取得する2つのメソッドがあります。データを取得するための入力パラメーターは、最初のメソッドで生成されたIDである必要があります。

private int savedrecordid =0;
private object[] SavedRecordId{ get { return new object[] { new object[] { savedrecordid  } }; } }


[Test]
public void InsertInfo()
{
    Info oInfo = new Info();
    oInfo.Desc ="Some Description here !!!";
    savedrecordid  = InsertInfoToDb(oInfo);
}

[Test]
[TestCaseSource("SavedRecordId")]
public void GetInfo(int savedId)
{
    Info oInfo  = GetInfoFromDb(savedId);
}

私は、各テストケースが別々に実行され、別々のインスタンスがテストメソッド間で変数を共有できないことを知っています。

テストケース間でパラメータを共有する方法があるかどうか教えてください。

4

1 に答える 1

5

あなたが説明する状況は、単体テストのアンチパターンの 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: 完全なサンプルはこちら

于 2012-12-13T10:12:41.500 に答える