문제
나는 MOQ를 처음 사용 하는데이 작업을 수행 할 수있는 방법을 찾을 수 없습니다. 나는 GenerateID 개인 방법을 호출합니다
/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}
이 방법을 테스트하고 싶었고 그 이유 때문에 프록시를 조롱해야합니다. SharedServicesClientProxy는 인터페이스 iSharedServices를 구현하지만 싱글 톤을 추가하는 객체 일뿐입니다. 나는 모든 문자열이 "ex"로 시작하는 문자열을 올바르게 반환하는 것을 테스트하고 싶었습니다. 이것은 MOQ를 사용하는 내 단위 테스트입니다
/// <summary>
/// A test for GenerateCallId
/// A CallId for external systems should always start by "EX"
///</summary>
[TestMethod()]
[DeploymentItem("myDll.dll")]
public void GenerateCallIdTest()
{
myService_Accessor target = new myService_Accessor();
var SharedServicesClientProxy = new Mock<ISharedServices>();
SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286);
string actual;
string extCallIdPrefix = "EX";
actual = target.GenerateCallId();
Assert.IsTrue(actual.StartsWith(extCallIdPrefix));
}
내가 잘못된 곳에서 모의를하고있는 것 같아요?
보다 일반적인 방법으로 테스트하는 방법으로 호출 될 객체를 어떻게 조롱합니까? 예를 들어 :
/// <summary>
/// dummy test
///</summary>
[TestMethod()]
[DeploymentItem("myDll.dll")]
public void Foo()
{
myService_Accessor target = new myService_Accessor();
boolexpected = false;
actual = target.Foo();
Assert.IsTrue(actual,expected);
}
/// <summary>
/// Foo
/// </summary>
/// <returns></returns>
private bool Foo()
{
return this.Bar();
}
MOQ 바를 필요로하지만 어디에서해야합니까? 감사합니다, Seb
해결책
진행하기 전에 "종속성 주입"이라는 용어를 검색하십시오.
당신은 의존성이 있습니다 SharedServicesClientProxy.Instance
, 싱글 톤입니다. 테스트에서 동일한 인스턴스를 재사용하고 상태 좌파 문제가 발생하기 쉬우므로 테스트 격리에 문제가 발생합니다.
나는 이와 같은 종속성을 주입하는 것이 좋습니다 (그리고 OT- 당신은 개인 메소드를 테스트해서는 안됩니다 ... 공개 인터페이스를 통해 테스트하십시오. 그것은 내 시스템에서 벗어났습니다 .. :) :)
public class AnonClass
{
ISharedServices _sharedServices;
AnonClass(ISharedServices sharedServicesObj)
{
_sharedServices = sharedServicesObj;
}
public string GenerateCallId()
{
return "EX" + _sharedServices.GenerateId().ToString();
}
}
현재 코드를 다시 연결하여 이와 같은 대상 클래스를 만듭니다.
var class = new AnonClass(SharedServicesClientProxy.Instance);
테스트에서 싱글 톤이 반환 한 객체 대신 모의 개체를 통과하십시오.
제휴하지 않습니다 StackOverflow