0

単体テストで POCO をカバーしたいと考えています。

それらをどのようにテストすればよいですか?

新しいプロパティを追加するとどうなりますか? テストを失敗させるにはどうすればよいですか?

私が知っているプロパティとメソッドをテストしていますが、問題は、テストが失敗することを確認する方法が、poco に何かが追加されていることです。

4

5 に答える 5

4

テストとは、書かれたものが本来あるべきことを実行できるかどうかを検証することであり、それ以上でもそれ以下でもありません。したがって、何らかのコードを記述する場合、それには理由があります。テストは、コードが実際にコードを書いた理由と一致することを反映する必要があります。それだけです、他には何もありません。Iow: 一連のクラスを作成する場合は、作成した動作が実際に正しいかどうかを、その動作が行うべきことと比較してテストする必要があります。

于 2009-05-26T12:36:00.010 に答える
3

あなたの質問を読むと、POCO とは何かを誤解しているか、単体テストを誤解しています。

POCO は昔ながらのオブジェクトです。状態と動作があります。プロパティに値を入力 (設定) し、その値が期待どおりであることをアサートして、状態の単体テストを行います。メソッドに対して期待値をアサートすることで、動作を単体テストします。

これは、POCO とそのテストの単純化された例です。実装コードよりも多くのテスト コードがあることに注意してください。単体テストが正しく行われている場合 (TDD)、これが当てはまります。

public class Person
{
    private Name name = Name.Empty;
    private Address address = Address.Empty;
    private bool canMove;

    public Name Name
    {
        set { name = value; }
        get { return name; }
    }

    public Address Address
    {
        private set { address = value; }
        get { return address; }
    }

    public bool CanMove
    {
        set { canMove = value; }
        get { return value; }
    }

    public bool MoveToNewAddress(Address newAddress)
    {
        if (!CanMove) return false;
        address = newAddress;
        return true;
    }
}

[TestFixture]
public class PersonTests
{
    private Person toTest;
    private readonly static Name NAME = new Name { First = "Charlie", Last = "Brown" };
    private readonly static Address ADDRESS =
        new Address {
            Line1 = "1600 Pennsylvania Ave NW",
            City = "Washington",
            State = "DC",
            ZipCode = "20500" };

    [SetUp]
    public void SetUp()
    {
        toTest = new Person;
    }

    [Test]
    public void NameDefaultsToEmpty()
    {
        Assert.AreEqual(Name.Empty, toTest.Name);
    }

    [Test]
    public void CanMoveDefaultsToTrue()
    {
        Assert.AreEqual(true, toTest.CanMove);
    }

    [Test]
    public void AddressDefaultsToEmpty()
    {
        Assert.AreEqual(Address.Empty, toTest.Address);
    }

    [Test]
    public void NameIsSet()
    {

        toTest.Name = NAME;
        Assert.AreEqual(NAME, toTest.Name);
    }

    [Test]
    public void CanMoveIsSet()
    {
        toTest.CanMove = false;
        Assert.AreEqual(false, toTest.CanMove);
    }

    [Test]
    public void AddressIsChanged()
    {
        Assert.IsTrue(toTest.MoveToNewAddress(ADDRESS));
        Assert.AreEqual(ADDRESS, toTest.Address);
    }

    [Test]
    public void AddressIsNotChanged()
    {
        toTest.CanMove = false;
        Assert.IsFalse(toTest.MoveToNewAddress(ADDRESS));
        Assert.AreNotEqual(ADDRESS, toTest.Address);
    }
}

最初にテストを失敗させるには、メソッドまたはプロパティをスタブしますが、動作は実装しません。テストを実行し、失敗するのを見てから、成功するまで一度に 1 行ずつ動作を追加します。過ぎたらストップ。追加のテストを作成しない限り、これ以上コードを作成しないでください (ただし、リファクタリングを行っている場合は除きます。この場合、動作は追加されません)。

于 2009-05-26T12:38:08.680 に答える
1
  1. たとえば、次のような自動生成されたプロパティがある場合は、独自のコードと一緒にフレームワークをテストするべきではないと思います。

    public string Name
    {get;set;}
    

    正常に機能しているかどうかを確認するためのテストメソッドを用意する必要はありません。

  2. クラスの内部状態をテストするのではなく、その動作をテストする必要があります。
  3. コードを書く前にテストを書く方が良い場合もあります(常に言う人もいます)。この方法では、実行方法を理解するのではなく、実行したいことを理解する必要があります(このアプローチはテスト駆動開発と呼ばれます)。

TDDサイクルは次のとおりです。

  • テストを書いて、赤い信号を取得します
  • コードを書いて、緑色の信号を取得します
  • コードをリファクタリングすると、緑色の信号が表示されます
于 2009-05-26T14:10:25.887 に答える
1

おそらく、POCO とは DTO を意味していたのでしょう。その場合、答えは次のようになります。

いいえ、DTO をテストするべきではありません。むしろ、DTO で動作するサービスをテストしてください。

于 2009-05-26T15:52:40.160 に答える
1

クラスに新しい機能を追加する場合は、その機能が実装されていないために失敗するテストを作成してから、機能を実装してテスト パスを確認します。

または...

ビルドの一部としてコード カバレッジ メトリクスを実行します。テストでカバーされずにコードガスが追加されたかどうかを示します。

または...

ビルドの一部としてミューテーション テストを実行します。コードをカバーするテストが実行されているだけで、実際には何もテストしていないかどうかを示します。

または上記のすべて。

于 2009-05-26T12:35:11.057 に答える