2010-06-25 59 views
20

Ví dụ, có một giao diện IMyInterface, và ba lớp hỗ trợ giao diện này:Làm cách nào để bạn kiểm tra giao diện?

class A : IMyInterface 
{ 
} 

class B : IMyInterface 
{ 
} 

class C : IMyInterface 
{ 
} 

Trong cách đơn giản nhất, tôi có thể viết ba lớp thử nghiệm: ATest, BTest, CTest và kiểm tra chúng riêng rẽ. Tuy nhiên, vì chúng hỗ trợ cùng một giao diện, hầu hết mã thử nghiệm sẽ giống nhau, rất khó để duy trì. Làm cách nào để sử dụng một cách đơn giản và dễ dàng để kiểm tra giao diện được hỗ trợ bởi các lớp khác nhau?

(previously asked on the MSDN forums)

Trả lời

17

Để kiểm tra giao diện với các kiểm tra phổ biến bất kể việc triển khai thực hiện, bạn có thể sử dụng trường hợp thử nghiệm trừu tượng và sau đó tạo các trường hợp thử nghiệm cho từng triển khai giao diện .

Trường hợp thử nghiệm trừu tượng (cơ sở) thực hiện các thử nghiệm trung gian thực hiện (ví dụ: xác minh hợp đồng giao diện) trong khi thử nghiệm cụ thể xử lý đối tượng để kiểm tra và thực hiện bất kỳ thử nghiệm cụ thể nào.

3

thể tạo các phương pháp mà phải mất một tham số có kiểu IMyInterface và có phương pháp thử nghiệm thực tế chỉ cần gọi các phương pháp đó đi qua trong lớp bê tông khác nhau.

2

Bạn không kiểm tra giao diện trực tiếp, nhưng bạn có thể viết một lớp trừu tượng để kiểm tra hợp đồng mà triển khai cụ thể sẽ mở rộng. Một thử nghiệm của một lớp cụ thể sau đó sẽ mở rộng lớp trừu tượng

37

Nếu bạn muốn chạy các bài kiểm tra tương tự đối với người thực hiện khác nhau của giao diện bằng cách sử dụng NUnit là một ví dụ:

public interface IMyInterface {} 
class A : IMyInterface { } 
class B : IMyInterface { } 
class C : IMyInterface { } 

public abstract class BaseTest 
{ 
    protected abstract IMyInterface CreateInstance(); 

    [Test] 
    public void Test1() 
    { 
     IMyInterface instance = CreateInstance(); 
     //Do some testing on the instance... 
    } 

    //And some more tests. 
} 

[TestFixture] 
public class ClassATests : BaseTest 
{ 
    protected override IMyInterface CreateInstance() 
    { 
     return new A(); 
    } 

    [Test] 
    public void TestCaseJustForA() 
    { 
     IMyInterface instance = CreateInstance(); 
     //Do some testing on the instance... 
    } 

} 

[TestFixture] 
public class ClassBTests : BaseTest 
{ 
    protected override IMyInterface CreateInstance() 
    { 
     return new B(); 
    } 
} 

[TestFixture] 
public class ClassCTests : BaseTest 
{ 
    protected override IMyInterface CreateInstance() 
    { 
     return new C(); 
    } 
} 
+0

Đây là một ví dụ tốt về câu trả lời đúng. – Chetan

+1

+1 Câu trả lời hay! Ngày nay NUnit hỗ trợ các lớp thử nghiệm chung và thuộc tính TestFixture có thể được sử dụng để cung cấp các kiểu cụ thể được sử dụng khi chạy thử nghiệm. Tôi đã viết một [bài đăng blog] (http://softwareonastring.com/2015/03/22/testing-every-implementer-of-an-interface-with-the-same-tests-using-nunit) về cách kiểm tra mọi người triển khai giao diện trình bày các tính năng này. –

+0

Câu trả lời trang nhã và súc tích ... –

0

Nếu bạn đang sử dụng NUnit, sau đó bạn có thể sử dụng Grensesnitt:

public interface ICanAdd { 
    int Add(int i, int j); //dont ask me why you want different adders 
} 

public class winefoo : ICanAdd { 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

interface winebar : ICanAdd { 
    void FooBar() ; 
} 

public class Adder1 : winebar { 
    public int Add(int i, int j) { 
     return i + j; 
    } 
    public void FooBar() {} 
} 

public class Adder2 : ICanAdd { 
    public int Add(int i, int j) { 
     return (i + 12) + (j - 12); //yeeeeeaaaah 
    } 
} 

[InterfaceSpecification] 
public class WithOtherPlugins : AppliesToAll<ICanAdd> 
{ 
    [TestCase(1, 2, 3)] 
    [TestCase(-1, 2, 1)] 
    [TestCase(0, 0, 0)] 
    public void CanAddOrSomething(int x, int y, int r) 
    { 
     Assert.AreEqual(subject.Add(x, y), r); 
    } 

    [TestCase(1, 2, Result = 3)] 
    [TestCase(-1, 2, Result = 1)] 
    [TestCase(0, 0, Result = 0)] 
    public int CannAddOrSomethingWithReturn(int x, int y) { 
     return subject.Add(x, y); 
    } 
} 
Các vấn đề liên quan