2014-02-28 2 views
1

Moq 프레임 워크를 사용하여 하나의 vb.net 프로젝트에서 테스트하고 있습니다.VB.net Moq 공용 공유 기능

내가 지금 가지고있는 상황은 다른 클래스의 '공용 공유 기능'에 대한 호출이 하나있는이 함수를 테스트하고 싶습니다.이 호출은 moq를 좋아합니다. 상황은 것은 공유 객체 하지 않기 때문에 내가 원하는 데이터를 얻을 수있는 데이터베이스 호출을 MOQ 수있다

'Sub in Main Class 
Public Sub StartProcess() 
    Dim total As Integer = CommonData.GetTotal() 
    ... 
End Sub 

'Function in CommonData class 
Public Shared Function GetTotal() 
    ... 
    Dim total As Integer = database.GetTotal() 
    ... 
    Return total 
End Sub 

과 유사하지만 나는 모든을 피하기 위해 CommonData.GetTotal을 MOQ되어 무엇을 좋아 내부 실행 어쨌든 그렇게 할 수 있습니까?

답변

2

공유 기능을 Moq과 직접 조롱 할 수 없습니다 (공유 기능을 실제로 모의 할 수있는 Typemock Isolator 또는 Microsoft Fakes와 같은 프레임 워크를 사용해야합니다).

그러나 인터페이스 뒤에있는 공유 코드에 대한 호출을 숨기고 해당 인터페이스의 구현을 조롱 할 수 있습니다.

Interface ICommonData 
    Function GetTotal() As Integer 
End Interface 

Public Sub StartProcess(commonData As ICommonData) 
    Dim total As Integer = commonData.GetTotal() 
    ... 
End Sub 

Public Class RealCommonData 
    Implements ICommonData 

    ...calls your shared function... 
End Class 

그래서 당신은 생산 및 단위 테스트에서 ICommonData의 모의에 RealCommonData을 사용합니다.


또는 라운드 다른 방법 :

Interface ICommonData 
    Function GetTotal() As Integer 
End Interface 

Public Class RealCommonData 
Implements ICommonData 

    Function GetTotal() As Integer Implements... 
     Dim total As Integer = database.GetTotal() 
     ... 
     Return total 
    End Function 
End Class 

Module CommonData 
    Shared _commonData As ICommonData 

    Public Shared Function GetTotal() 
     Return _commonData.GetTotal() 
    End Function 
End Module 

그래서, 생산에 당신이 RealCommonData의 인스턴스 CommonData._commonData을 설정하고 단위 테스트에서 모의에 대한 것입니다.

이 방법을 사용하면이 코드 부분을 변경하지 않고 전에처럼 CommonData.GetTotal() 님에게 전화를 걸 수 있습니다. 일부 사람들이 정적 게이트웨이 패턴 또는 이와 유사한 코드라고 부르는 것을 들었습니다.

+0

고마워요 도미니크,이게 내가 생각하기에,이 클래스를 응용 프로그램에서 모두 사용하기 때문에이 인터페이스를 사용하지 않는 것이 좋습니다. 인스턴스화하지 않고도 액세스 할 수 있습니다. 어쩌면 싱글 톤 패턴으로 변경하여 두 가지 방식을 혼합 할 수 있습니다. – ajimenez

+0

당신은 물론 다른 방향으로 갈 수 있습니다. 공유 함수의 코드를 인터페이스를 구현하는 비공유 클래스/함수 안에 넣고 공유 함수가 해당 인터페이스에서 작동하도록합니다. 공유 된 분야에서 일할 것입니다.) 그런 다음 공유 기능을 그대로 사용하는 코드는 그대로 둘 수 있습니다. – sloth

+0

예를 보려면 제 편집을보십시오. – sloth