문제

나는 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);

테스트에서 싱글 톤이 반환 한 객체 대신 모의 개체를 통과하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top