2016-09-30 7 views
1

실패 내가 대신 조롱 유형, UrlHelper 클래스와 같은 시도 할 때, 실제 유형이 인스턴스화되고 있습니다.비웃음 생성자 호출은 우리가</p> <pre><code>Mock.Arragne(()=>new MyClass(Arg.IsAny<string>())).IgnoreInstance().Returns(Mock.Create<MyClass>()); </code></pre> <p>같은 생성자 호출을 정리하지만,에 의해 대신 실제 인스턴스의 조롱 인스턴스를 돌려 줄 수있는 justmock에서 UrlHelper

public void UrlTest() 
{ 
    Mock.Arrange(() => HttpContext.Current.Request.RequestContext).Returns(Mock.Create<RequestContext>()); 

    var mockedUrl = Mock.Create<UrlHelper>(); 

    Mock.Arrange(() => new UrlHelper(Arg.IsAny<RequestContext>())) 
     .IgnoreArguments() 
     .IgnoreInstance() 
     .Returns(mockedUrl); 

    //Here url will have actual instance instead of mocked instance 
    var model = new UrlModel(); 

    //Assert is ommitted for bravity .. 
} 

답변

0

당신은 수동으로 UrlModel의 생성자에서 UrlHelper의 인스턴스를 인스턴스화됩니다

public class UrlModel 
    { 
     private UrlHelper url; 
     public UrlModel() 
     { 
      url = new UrlHelper(HttpContext.Current.Request.RequestContext); 
     } 
    } 

시험 방법

UrlModel 클래스 :이 어떤 잘못이 있는지 아무도 알 수 있습니다. UrlModel은 이제 UrlHelper에 단단히 결합됩니다 (신품은 접착제입니다). 이제 테스트 따라

public void UrlTest() { 
    Mock.Arrange(() => HttpContext.Current.Request.RequestContext) 
     .Returns(Mock.Create<RequestContext>()); 

    var mockedUrl = Mock.Create<UrlHelper>(Constructor.Mock); 
    var mockedAccessor = Mock.Create<IUrlHelperAccessor>(); 

    Mock.Arrange(() => mockedAccessor.UrlHelper).Returns(mockedUrl); 

    //Here url will have actual instance instead of mocked instance 
    var model = new UrlModel(mockedAccessor); 

    //Assert is omitted for brevity .. 

} 
을 마련 좀 더 느슨하게 결합 된 모델과 개선 된 모의 능력

public interface IUrlHelperAccessor { 
    UrlHelper UrlHelper { get; } 
} 

을 허용 할 수있는 의존성 추상화를 확인하고 UrlModel

public class UrlModel { 
    private UrlHelper url; 
    public UrlModel(IUrlHelperAccessor accessor) { 
     url = accessor.UrlHelper; 
    } 
    //...other code 
} 

으로 그것을 주입

1

Typemock을 사용하면 새로운 인터페이스를 추가하지 않고 RequestContext을 속인하고 속성을 수정하여 코드를 테스트 할 수 있습니다 Y 동작 :

[TestMethod,Isolated] 
public void UrlTest() 
{ 
    //Arrange 
    var fakeRequest = Isolate.Fake.Instance<RequestContext>(); 
    Isolate.WhenCalled(() => HttpContext.Current.Request.RequestContext).WillReturn(fakeRequest); 

    //Act 
    var res = new UrlModel(); 
    //getting the private field so it can be asserted 
    var privateField = Isolate.NonPublic.InstanceField(res, "url").Value as UrlHelper; 

    //Assert 
    Assert.AreEqual(fakeRequest, privateField.RequestContext); 
} 
0

일을하지 않았을이 경우 조롱 생성자가 UrlModel 클래스는 테스트 클래스의 일부가되었습니다이다 유일한 이유 - 테스트 클래스의 코드가 mockable 그 자체입니다.

다른 점은 디버거가 잘못 읽은 것일 수 있다는 것입니다. 프로파일 러를 실행하는 비 추상적 유형의 모의 객체를 만들 때 인스턴스 자체는 조롱 된 유형과 동일한 유형입니다. 프로파일 러가 실행되지 않는 경우와 마찬가지로 파생 유형이 아닙니다 (예 : UrlHelperMock). new에서 반환 된 모의 인스턴스와 인스턴스가 실제로 같지 않다는 디버거 Make Object ID 함수를 사용하여 확인할 수 있습니까?

UrlHelper 배열이 작동하지 않았기 때문에 new 표현 조롱이 ​​작동하지 않는다는 결론에 도달 했습니까?