2008-09-17 4 views
3

Rob Connery의 Asp.net MVC 매장의 라인을 따라 C#으로 장난감 웹 애플리케이션을 제작했습니다.리포지토리 인터페이스의 다양한 구현에 동일한 테스트 스위트 사용

나는, 방법과, IFooRepository 호출, 내가 저장소 인터페이스를 찾을

IQueryable<Foo> GetFoo(); 
void PersistFoo(Foo foo); 

말 그리고 나는이 세 가지 구현이 있습니다 ISqlFooRepository, IFileFooRepostory 및 IMockFooRepository을.

또한 테스트 사례가 있습니다. 내가 뭘하고 싶고, 아직 어떻게 해야할지 모르지만,이 세 가지 구현의 각각에 대해 동일한 테스트 케이스를 실행하고 각 인터페이스 유형에 대해 각 테스트 단계마다 녹색 눈금을 지정하는 것입니다.

[TestMethod] 
Public void GetFoo_NotNull_Test() 
{ 
    IFooRepository repository = GetRepository(); 
    var results = repository. GetFoo(); 
    Assert.IsNotNull(results); 
} 

이 테스트 방법을 세 가지 유형의 저장소를 사용할 수있는 환경의 변형과 함께 세 번 실행하고 싶습니다. 현재 개인 도우미 메서드의 구현에서만 다른 3 개의 잘라 붙여 넣기 테스트 클래스가 있습니다. IFooRepository GetRepository(); 분명히, 이것은 냄새 나는 것입니다.

그러나 잘라 내기 및 붙여 넣기 방법을 통합하여 중복을 제거 할 수는 없습니다. 테스트를 실행하기위한 테스트로 표시되고 공개되어야하기 때문입니다.

저는 Microsoft 테스트 프레임 워크를 사용하고 있으며 가능한 경우 그대로두기를 원합니다. 그러나 MBUnit에서이 작업을 수행하는 방법에 대한 제안은 어느 정도 흥미로울 것입니다.

답변

3

는 테스트 및 IFooRepository를 반환하는 추상적 인 GetRepository 방법의 구체적인 버전을 포함하는 추상 클래스를 만듭니다. 추상 클래스에서 파생 된 세 클래스를 만듭니다. 각 클래스는 적절한 IFooRepository 구현을 반환하는 방식으로 GetRepository를 구현합니다. 세 가지 클래스를 모두 테스트 스위트에 추가하면 바로 사용할 수 있습니다.

MbUnit '[FixtureCategory]'속성을 사용하여 테스트를 분류하려면 테스트 범주를 '빠르다', '느리게', '중요하다', '중요'(마지막 두 농담입니다 - 정직!)

3

MbUnit에서 RowTest 특성을 사용하여 테스트에서 매개 변수를 지정할 수 있습니다.

[RowTest] 
[Row(new ThisRepository())] 
[Row(new ThatRepository())] 
Public void GetFoo_NotNull_Test(IFooRepository repository) 
{ 
    var results = repository.GetFoo(); 
    Assert.IsNotNull(results); 
} 
+0

좋은 답변이지만 NUnit과 RowTest를 사용하면 Rick의 대답처럼 행 테스트에서 열거 형을 사용하게됩니다. 근본적으로, 그는 RowTest를 어려운 방법으로하고 있습니다. – Anthony

+0

글쎄, 필자는 릭보다 먼저 대답을 올렸다. 그래서 나는 그가 무엇을하고 있는지 전혀 모른다. –

1

당신이 3 복사 및 붙여 넣기 시험 방법이있는 경우, 당신은이 중복 없애 (추출 방법) 리팩토링 할 수 있어야한다.

즉 이것은 내가 생각했던 것입니다 :

private IRepository GetRepository(RepositoryType repositoryType) 
{ 
    switch (repositoryType) 
    { 
      case RepositoryType.Sql: 
      // return a SQL repository 
      case RepositoryType.Mock: 
      // return a mock repository 
      // etc 
    } 
} 

private void TestGetFooNotNull(RepositoryType repositoryType) 
{ 
    IFooRepository repository = GetRepository(repositoryType); 
    var results = repository.GetFoo(); 
    Assert.IsNotNull(results); 
} 

[TestMethod] 
public void GetFoo_NotNull_Sql() 
{ 
    this.TestGetFooNotNull(RepositoryType.Sql); 
} 

[TestMethod] 
public void GetFoo_NotNull_File() 
{ 
    this.TestGetFooNotNull(RepositoryType.File); 
} 

[TestMethod] 
public void GetFoo_NotNull_Mock() 
{ 
    this.TestGetFooNotNull(RepositoryType.Mock); 
} 
+0

좋습니다. 나는 그것이 최선의 방법이라고 확신하지 못하지만, 그것은 길이다. – Anthony

+0

스위트 룸 내에 많은 테스트가있을 때까지는 괜찮습니다. 그런 다음 반복을 많이합니다. – belugabob

0
[TestMethod] 
public void GetFoo_NotNull_Test_ForFile() 
{ 
    GetFoo_NotNull(new FileRepository().GetRepository()); 
} 

[TestMethod] 
public void GetFoo_NotNull_Test_ForSql() 
{ 
    GetFoo_NotNull(new SqlRepository().GetRepository()); 
} 


private void GetFoo_NotNull(IFooRepository repository) 
{ 
    var results = repository. GetFoo(); 
    Assert.IsNotNull(results); 
} 
0

가 요약하면, 이동하는 세 가지 방법이 있습니다 :

1) 일반적인 방법으로 아래로 전화를 테스트 한 라이너를 확인이 (답 릭, 또한 홀그림)

2) MBUnit 's Row 사용 이 기능을 자동화하는 테스트 기능 (Jon Limjap의 답변). 여기에도 열거 형을 사용합니다.

[RowTest] 
[Row(RepositoryType.Sql)] 
[Row(RepositoryType.Mock)] 
public void TestGetFooNotNull(RepositoryType repositoryType) 
{ 
    IFooRepository repository = GetRepository(repositoryType); 
    var results = repository.GetFoo(); 
    Assert.IsNotNull(results); 
} 

3) 나는이 아이디어

public abstract class TestBase 
{ 
    protected int foo = 0; 

    [TestMethod] 
    public void TestUnderTen() 
    { 
     Assert.IsTrue(foo < 10); 
    } 

    [TestMethod] 
    public void TestOver2() 
    { 
     Assert.IsTrue(foo > 2); 
    } 
} 

[TestClass] 
public class TestA: TestBase 
{ 
    public TestA() 
    { 
     foo = 4; 
    } 
} 

[TestClass] 
public class TestB: TestBase 
{ 
    public TestB() 
    { 
     foo = 6; 
    } 
} 

이 두 가지 테스트 클래스에서 네 통과 시험 생산을 기반으로 샘플을 만든 belugabob
하여 기본 클래스, 대답을 사용합니다. 3
그나은 다음과 같습니다
1) 최소 추가 코드, 최소 유지 보수 필요하다면 새 저장소를 연결하는
2) 최소 입력 - 그것은 다른 사람과는 달리, 한 곳에서 할 수있다.

단점은 다음과 같습니다 읽을
2) 열심히 할 필요가있는 경우에
1) 이하의 유연성은 제공자에 대한 테스트를 실행할 수 없습니다.

관련 문제