0

単純なロジックが 80%、複雑なロジックが 20% のプロジェクトで TDD を実行しています。特定のメソッドがエラーをスローし、それを行う正しい方法について疑問に思っている場合、私は自分自身が多くのテストを行っていることに気づきます。NUnit と JustMock を使用しています。

これには2つの方法があります。ExpectedException 属性を使用し、型を指定します。または以下のように書く。以下のように書くことのプロは、例外.メッセージをアサートすることもでき(カスタムのものを作成した場合)、テストが失敗した場合も例外.メッセージが表示されることです。しかし、私はあなたがどのようにそれを行うかを他の人に確認したかった. 要約すると:

  1. このような例外に対して多くのテストを行うのは普通ですか?
  2. これは正しい方法ですか:

説明するだけ:サプライヤーは特定の契約を提供し、部門は1つの契約を受け入れますが、同じサプライヤーと複数の契約を持つことはできません(もちろん、異なるサプライヤーと異なる契約を持つことはできます)

    [Test]
    public void Accepting_more_than_one_contract_from_supplier_throws_exception()
    {
        //Arrange
        var department = new Department(Guid.NewGuid(), "1234");
        var supplier = Mock.Create<Supplier>();
        var contract1 = Mock.Create<DeliveryContract>();
        var contract2 = Mock.Create<DeliveryContract>();
        var id = Guid.NewGuid();
        supplier.Arrange(x => x.Id).Returns(id);
        contract1.Arrange(x => x.Supplier).Returns(supplier);
        contract2.Arrange(x => x.Supplier).Returns(supplier);

        //Act
        department.AcceptContract(contract1);

        //Assert
        try
        {
            department.AcceptContract(contract2);
            Assert.Fail("Duplicate contract with supplier did not throw an exception");
        }
        catch (Exception ex)
        {   
            Assert.AreEqual(typeof(ArgumentException),ex.GetType(),ex.Message);
        }
    }
4

2 に答える 2

6

Assert.Throwsメソッドを使用できます。

Assert.Throws<ArgumentException>(() => department.AcceptContract(contract2));

また

Assert.Throws<ArgumentException>(() => department.AcceptContract(contract2), "some message");
于 2013-10-12T08:38:57.457 に答える
2

@Ufukが言ったように。Assert.Throws<T>T が例外タイプの場合に使用します。

例外メッセージも確認したい場合は、次のいずれかを使用します。

T Assert.Throws<T>( TestDelegate code, string message );
T Assert.Throws<T>( TestDelegate code, string message, 
        params object[] parms);

ちなみに、テスト用に作成したデータはモックではなくスタブにする必要があります。スタブとは、テスト用のデータのみを含むオブジェクトを意味します。あなたの場合、データではなくオブジェクトの動作を提供します。

NBuilder code.google.com/p/nbuilder/の使用をお勧めします。それによって明確なスタブを作成できます。また、オブジェクトを作成する柔軟性も高く、ランダムに作成することも、テスト ケースに合わせて正確に作成することもできます。

あなたの場合の使用法:

var supplierStub = Builder<Supplier>
                .With(supplier => supplier.Id = id)
                .Build();

var contractsStub = Builder<DeliveryContract>.CreateListOfSize(2)
                .All()
                    .With(contract => contract.Supplier = supplierStub)
                .Build();

于 2013-10-12T09:00:51.330 に答える