2013-07-15 26 views
20

Tôi đang nhìn vào một số mã kiểm tra sử dụng NUnit, mà kế thừa từ một lớp cơ sở có chứa một [Setup] thuộc tính:NUnit và [Setup] trong các lớp cơ sở

public class BaseClass 
{ 
    [SetUp] 
    public void SetUp() 
    { 
    //do something 
    } 

} 

[TestFixture] 
public class DerivedClass : BaseClass 
{ 
    [SetUp] 
    public void SetUp() 
    { 

    //do something else, with no call to base.SetUp() 
    } 
    //tests run down here. 
    //[Test] 
    //[Test] 
    //etc 
} 

Các lớp có nguồn gốc chắc chắn sẽ cần việc được thực hiện trong phương thức SetUp() của lớp cơ sở.

Tôi có thiếu thứ gì đó hay phương thức SetUp() trong lớp cơ sở không được gọi khi kiểm tra của lớp dẫn xuất được chạy? Có điều gì đó đặc biệt với thuộc tính [SetUp] đảm bảo rằng một thuộc tính sẽ được gọi trước thuộc tính kia không?

+0

Chỉ là một gợi ý khác cho bất kỳ ai đấu tranh với vấn đề này: Đảm bảo phương thức 'SetUp' của bạn là công khai. R # không cảnh báo bạn nếu chúng là riêng tư nhưng chúng sẽ không chạy. – lex82

+0

Câu trả lời cập nhật cho NUnit 2.5+ tại đây: http://stackoverflow.com/a/22099351/532647 –

Trả lời

22

Bạn chỉ có thể có một phương pháp SetUp.

Một TestFixture chỉ có thể có một phương pháp SetUp. Nếu có nhiều hơn một được định nghĩa thì TestFixture sẽ biên dịch thành công, nhưng các thử nghiệm của nó sẽ không chạy.

http://www.nunit.org/index.php?p=setup&r=2.2.10

Nếu bạn cần phải bổ sung thêm lý thiết lập trong một lớp học trẻ em, đánh dấu SetUp như ảo trong lớp cha mẹ của bạn, ghi đè lên nó, và gọi base.SetUp() nếu bạn muốn thiết lập các lớp cơ sở để chạy, quá .

public class BaseClass 
{ 
    [SetUp] 
    public virtual void SetUp() 
    { 
    //do something 
    } 

} 



[TestFixture] 
public class DerivedClass : BaseClass 
{ 
    public override void SetUp() 
    { 
    base.SetUp(); //Call this when you want the parent class's SetUp to run, or omit it all together if you don't want it. 
    //do something else, with no call to base.SetUp() 
    } 
    //tests run down here. 
    //[Test] 
    //[Test] 
    //etc 
} 
+0

Cảm ơn. Vì vậy, đó là trường hợp mã trên không chính xác, và phương thức SetUp() cơ sở sẽ không được gọi? – larryq

+0

@larryq mã trong câu hỏi của bạn không hợp lệ vì bạn có hai phương pháp trong chuỗi kế thừa có thuộc tính [Thiết lập]. Sửa chữa là chỉ có một phương pháp với SetUp và sau đó ghi đè lên nó khi cần thiết. – vcsjones

+0

Đó là những gì tôi nghĩ, cảm ơn bạn. (Đoạn mã trên được dán từ một dự án mà tôi đang làm, và tôi tự hỏi mình có bỏ sót điều gì không.) – larryq

1

Nhà xây dựng là bạn của bạn.

Nếu bạn muốn có hành vi thiết lập phụ gia - hãy sử dụng các hàm tạo vì cú pháp của chúng trực quan hơn cho điều này.

Ngoài ra, bạn cũng nên xem xét lý do tại http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html

+1

Đây không phải là câu trả lời rất kỹ lưỡng. Các nhà thầu sẽ giải quyết vấn đề này như thế nào? – vcsjones

+0

Tôi muốn giữ các nhà thầu như trọng lượng nhẹ nhất có thể để bạn không có nguy cơ bị nổ khi tạo vật thể. – tsells

+0

Tôi đồng ý về các lớp "sản xuất", nhưng hãy nhớ - các bài kiểm tra ở đó ĐỂ KHÔNG PHẢI. Nếu tôi nhận được một ngoại lệ trong c-tor hoặc cách khác - điều đó ảnh hưởng đến tôi như thế nào? – Arielr

43

Trước khi NUnit 2.5 câu trả lời trước là chính xác; bạn chỉ có thể có một thuộc tính [SetUp] cho một thử nghiệm.

Với NUnit 2.5 trở đi, bạn có thể có nhiều phương pháp được trang trí với thuộc tính [SetUp]. Do đó, dưới đây là hoàn toàn hợp lệ trong NUnit 2.5+:

public abstract class BaseClass 
{ 
    [SetUp] 
    public void BaseSetUp() 
    { 
     Debug.WriteLine("BaseSetUp Called") 
    } 
} 

[TestFixture] 
public class DerivedClass : BaseClass 
{ 
    [SetUp] 
    public void DerivedSetup() 
    { 
     Debug.WriteLine("DerivedSetup Called") 
    } 

    [Test] 
    public void SampleTest() 
    { 
     /* Will output 
     * BaseSetUp Called 
     * DerivedSetup Called 
     */ 
    } 
} 

Khi kế thừa NUnit sẽ luôn chạy phương pháp '[SetUp]' trong lớp cơ sở trước. Nếu nhiều phương thức [SetUp] được khai báo trong một lớp NUnit không thể đảm bảo thứ tự thực thi.

See here for further information.

Các vấn đề liên quan