2016-09-30 4 views
1

で失敗した私はUrlHelperクラスで同じことをしようとしたとき、私たちは、代わりに嘲笑のタイプで、モックコンストラクタ呼び出しがjustmockでUrlHelper

Mock.Arragne(()=>new MyClass(Arg.IsAny<string>())).IgnoreInstance().Returns(Mock.Create<MyClass>()); 

のようなコンストラクタ呼び出しを配置することにより、代わりに実際のインスタンスの嘲笑のインスタンスを返すことができますが、実際の型がインスタンス化されています。

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 interface IUrlHelperAccessor { 
    UrlHelper UrlHelper { get; } 
} 

を可能にすることができます依存関係の抽象化を作成し、UrlModel

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

にそのを注入今、あなたはそれに応じ

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 .. 

} 
テストを手配
1

Typemockを使用すると、新しいインターフェイスを追加せずにコードをテストしたり、RequestContextを偽造してプロパティを変更したりすることができますyの行動: - テストクラスのコードはmockableそのものではない

[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クラスはテストクラスの一部となっているということです。

もう1つのことは、デバッガに誤解されている可能性があることです。プロファイラが実行されている非抽象型のモックを作成する場合、インスタンス自体は模擬型と同じ型です。つまり、プロファイラが実行されていない場合と同様に、派生型ではありません(UrlHelperMockなど)。デバッガMake Object IDの機能を使用して、モックインスタンスとnewから返されたインスタンスが実際に同じではないことを確認できますか?

UrlHelperのアレンジメントがうまくいかず、new式の模擬がうまくいかなかったという結論に達しましたか、それとも別のものでしたか?

関連する問題