2

Moq フレームワークを使用して単体テストを作成しており、返すコントローラー関数があります。

return Json(new
{    
    redirectUrl = Url.Action("Action", "Controller"),
    isredirection = true
});

結果をテストできるようにしたいのですが、これを返すかredirectUrlどうかを指定できるように設定するにMockはどうすればよいですか?Url.Action.Url.Action("Action", "Controller")

4

1 に答える 1

1

できません。モックについて覚えやすいルールがあります-オーバーライドできず、モックできません1。クラスから派生している場合Url、メソッドをオーバーライドできますActionか? いいえ。Moq、Rhino、FakeItEasy、または DynamicProxy に基づくその他のフレームワークも使用できません。

あなたのオプションは以下のものを絞り込みます:

  • DynamicProxy に基づいていない別のフレームワークを使用します (これは通常、高度な傍受のためのコンパイラ サービスに基づくことを意味します)。そのようなツールは通常有料です。
  • 問題のある呼び出しをインターフェース/デリゲートでラップし、テスト済みのコードに挿入します(無料のフレームワークを使用してモックできるように)

ラッピングはどのようになりますか?

public interface IUrlWrapper
{
    string Action(string name, object values);
}

// Wrapper Interface
public class TestedClass
{
    private readonly IUrlWrapper url;

    public TestedClass(IUrlWrapper urlWrapper)
    {
        this.url = urlWrapper;
    }

    // ...

    return Json(new
    {
        redirectUrl = this.url.Action("Action", "Controller"),
        isredirection = true
    });

    // ...
}

このようなセットアップでは、Moq を問題なく使用できます。ただし、単一のメソッド呼び出しではFunc、分離フレームワークなしでデリゲートを使用することもできます。

// Func Delegate
public class TestedClass
{
    private readonly Func<string, object, string> urlAction;

    public TestedClass(Func<string, object, string> urlAction)
    {
        this.urlAction = urlAction;
    }

    // ...

    return Json(new
    {
        redirectUrl = this.urlAction("Action", "Controller"),
        isredirection = true
    });

    // ...
}

テストでは、その場でデリゲートを作成するだけです。


1 私はブログ投稿を書き、この問題の詳細をもう少し詳しく説明しました: How to mock private method with ...

于 2013-03-07T11:08:54.643 に答える