2010-01-19 2 views
1

나는 비즈니스 계층에서 비슷한 메서드를 사용합니다. 나는 단위 테스트에 익숙하지 않고 때때로 혼란스러워합니다. 아이디어를 얻으려면이 방법을 테스트하기위한 더 나은 방법은 무엇입니까? ? 나는단위 테스트 다음 메서드에서 "ref"를 사용하여 값을 반환하는 방법

Adapter는 비주얼 스튜디오 2008, 데이터 세트 디자이너

DB에 저장 프로 시저를 사용하는 함수의 TableAdater

AddDeveloperCategoryReturnID() = 이름을 생성 = C 번호 NUnit를하고 MOQ

public int? AddNewCatRetID(string categoryName) 
{ 
    int? categoryID = 0; 
    Adapter.AddNewBlogCategoryReturnID(categoryName, ref categoryID); 

    if (categoryID.HasValue) 
    return categoryID; 

    return 0; 
} 

을 사용하고 있습니다

새 레코드 인 "Category"를 추가하고 자동 생성 된 ID를 반환합니다. 0이 아닌 경우 추가 처리를 위해 결과를 가져옵니다. 나는 데이터베이스에 대화에 관심을 안 알고

는 아래의 단지

PROCEDURE [dbo].[AddDeveloperCategoryReturnID] 

@NAME NVARCHAR(MAX), 
@CATEGORY_ID INT OUTPUT 
AS 
BEGIN 
INSERT INTO [AllTimeGreatProgrammersDateBase].dbo.CATEGORIES(NAME) 
VALUES (@NAME); 

SET @CATEGORY_ID = SCOPE_IDENTITY(); 

SELECT @CATEGORY_ID; 
END 

몇 가지 문제 확인하는 방법

  • DB에 무슨 일이 일어나고 있는지에 대한 아이디어를 제공하는 절차입니다 메서드에서 "ref"를 사용하여 반환 된 값
  • 테스트하고 테스트하지 않으려는 것은 무엇입니까? 할 수있는 경우 위대 될 것입니다
+1

왜 처음부터 ref 매개 변수를 사용하고 있습니까? 그냥 반환 값으로 만드십시오. –

+0

categoryId가 Nullable 인 이유는 무엇입니까? 당신이 그것을 int로 형변환하면 null입니다. 예외가 발생합니다. – magnus

+0

@jon Skeet : ref를 사용하여 저장 프로 시저의 결과를 반환하는 방법을 잘 모릅니다. @magnus : 그것은 가상의 방법은 당신의 추천 –

답변

1

먼저 참조로 변수를 반환하는 대신 Adapter.AddNewBlogCategoryReturnID(categoryName, ref categoryID)을 변환하여 단순히 값을 반환했습니다.

그런 다음 가상 메서드로 추출합니다.

AddNewCatRetID을 테스트하려면 클래스를 확장하여 테스트 가능한 버전으로 만들고 해당 가상 메서드를 재정의하여 int?을 공용 변수에 저장합니다.

그런 식으로 데이터베이스에 0이있는 상황에서 AddNewCatRetID을 호출 할 때 어떤 결과가 발생하는지 테스트 할 때 실제로 데이터베이스에 0을 넣을 필요는 없습니다. 테스트 할 수있는 버전의 클래스이며, 테스트에서 AddNewCatRetID이 호출되면 데이터베이스를 치는 대신 설정 한 값만 반환됩니다. 데이터베이스를 치는 것을 피할 수 있으면 테스트가 더 빠르며, MS의 생성 된 어댑터이기 때문에 실제로 테스트 할 필요가 없습니다. 어댑터가 반환하는 메소드로 수행하는 작업 만 신경 써야합니다.

+0

"ref"를 테스트하는 방법, 'if'가 유일한/최선의 옵션입니까? –

+0

'ref' 만 옵션이라면, 가상 메소드도 ref로 값을 리턴하게 할 것입니다. 솔직하게 말하면 ref로 돌아 오는 것에 익숙하지 않지만, 올바르게 이해하면 ref 변수의 값을 공개 필드의 값으로 설정합니다. –

+0

가상 메소드는 디자이너가 자동 생성합니다. 내가 시도한 한 가지 옵션은 필요한 결과를 얻고 정상적으로 반환하는 사용자 정의 메서드에이 자동 생성 된 메서드를 래핑하는 것입니다.하지만 단원 테스트를 위해 –

2

어댑터 유형의 특성에 따라 몇 가지 옵션이 있습니다. AddDeveloperCategoryReturnID가 가상 또는 인터페이스 일 경우 Test Double (수동 롤링 또는 동적 모의)을 사용하여 동작을 일부 테스트 관련 동작으로 대체 할 수 있습니다.

  • 리팩토링 방법이 더 테스트 할 수 있도록하려면 다음 비 가상 방법 인 경우

    , 당신은 두 가지 옵션이 있습니다.

  • 데이터베이스 왕복과 관련된 자동화 된 테스트를 작성하십시오.

데이터베이스와 관련된 자동화 된 테스트는 순수한 단위 테스트보다 작성하고 유지하기가 더 어려워서 리팩토링 옵션으로 촬영하는 경향이 있습니다.

반면에 저장 프로 시저가 자동화 된 테스트에 의해 보호되어야하는 중요한 코드 자산을 나타내면 데이터베이스 테스트를 작성하지 않아도됩니다.

+0

에 따라 고정이 서명입니다 : public 가상 객체 AddDeveloperCategoryReturnID (문자열 이름, 심판 글로벌 :: 선택 System.Nullable CATEGORY_ID) {디자이너가 코드를 생성 //} –

+1

당신은 할 수있다 그것을 조롱 할 수 있지만, 그것은'Adapter '가 무엇인지에 달려있다. 공공 서면 자산 또는 공공 가상 재산입니까? 첫 번째 경우에는 Test Double로 바꿀 수 있습니다. 후자의 경우 Extract & Override 단위 테스트 패턴을 사용할 수 있습니다. –

관련 문제