2

justmock では、コンストラクター呼び出しを次のように配置することで、実際のインスタンスの代わりにモック化されたインスタンスを返すことができます。

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

しかし、クラスで同じことを試してみると、UrlHelperモックされた型ではなく、実際の型がインスタンス化されています。これに間違いがあるかどうかは誰にもわかりますか:

UrlModel クラス

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

試験方法 :

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

3 に答える 3

1

Typemockを使用して、新しいインターフェイスを追加せずにRequestContext、プロパティの動作を偽造して変更することにより、コードをテストできます。

[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);
}
于 2016-10-05T07:29:41.003 に答える
0

UrlHelperのコンストラクターで のインスタンスを手動でインスタンス化していますUrlModelUrlModelは密結合になりましたUrlHelper( new is glue )。より疎結合されたモデルと改善されたモック機能を可能にする依存関係の抽象化を行います

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

}
于 2016-09-30T10:30:23.190 に答える