Thứ Bảy, 22 tháng 11, 2014

Test-Driven Development (TDD) trong .NET – Phần 2

Trong Phần 1 chúng ta đã hoàn thành Test 1, bây giờ tiếp theo phần này chúng ta sẽ hoàn thành Test số 2.

Test 2:  Push một đối tượng đơn vào Stack và xác nhận IsEmpty là false

Bây giờ chúng ta sẽ viết code để test yêu cầu này.
    [Test]
    public void PushOne()
    {
        Stack stack = new Stack();
        stack.Push("first element");
        Assert.IsFalse(stack.IsEmpty,
            "Sau khi Push. IsEmpty phải bằng false.");
    }
Và tất nhiên, ta sẽ viết phương thức Push cho lớp Stack.
    public void Push(object obj)
    {
    }
Bây giờ, ta thực hiện chạy NUnit Test với PushOne và cho kết quả sau:
Passed: 1 Failed: 1 Errors: 0 Inconclusive: 0 Invalid: 0 Skipped: 0 Time: 0.078125
StackFixture.PushOne:  Sau khi Push. IsEmpty phải bằng false.
  Expected: False
  But was:  True
Kết quả test fail bởi vì sau khi Push thì m_IsEmpty = false, nhưng ở đây vẫn đặt là true. Do đó, ta thực hiện thay đổi phương thức Push như sau:
    public void Push(object obj)
    {
        m_IsEmpty = false;
    }
Trước khi cài đặt Test Case tiếp theo, chúng ta cần hiệu chỉnh code test để tránh trùng lặp code. Do đó, ta sẽ tạo thêm các phương thức Init để làm việc này với thuộc tính được khai báo là [Setup], nó sẽ tự động khởi tạo các dữ liệu cần thiết trước khi chạy mỗi Test Case. Đây là mã nguồn sau khi hiệu chỉnh:
using System;
using NUnit.Framework;

[TestFixture]
public class StackFixture
{
    private Stack stack;

    [SetUp]
    public void Init()
    {
        stack = new Stack();
    }

    [Test]
    public void Empty()
    {
        Assert.IsTrue(stack.IsEmpty);
    }

    [Test]
    public void PushOne()
    {
        stack.Push("first element");
        Assert.IsFalse(stack.IsEmpty,
            "Sau khi Push. IsEmpty phải bằng false.");
    }
}
Trên đây là một ví dụ tuyệt vời cho nguyên tắc thứ 2 của TDD: Loại trừ trùng lặp.
Bây giờ, kết quả chạy của các test case đã được cài đặt đều pass. Do đó, ta sẽ chuyển qua Test Case tiếp theo.

Không có nhận xét nào: