0

これが重複した質問である場合はお詫び申し上げます(そのようなものは見つかりませんでした)。OpenId認証サービスを構築して単体テストしようとしていますが、現在、次の設定があります。

public class OpenIdAuthenticationService : IAuthenticationService
{
    private IConfigurationService   _configService;
    private OpenIdRelyingParty      _openIdRelyingParty;

    public OpenIdAuthenticationService(IConfigurationService configService)
    {
        _configService      = configService;
        _openIdRelyingParty = new OpenIdRelyingParty();            
    }
}

どうやらOpenIdRelyingPartyはHttpContextへのアクセスを必要としますが、OpenIdRelyingPartyをモックしてサービスを注入する方法はありますか?または、HttpContextをモックして、なんとかしてOpenIdRelyingPartyに提供しますか?

4

3 に答える 3

1

あなたはすでにそれを行っているので、OpenIdRelyingParty構成サービスで行っているようにコンストラクターに注入します。

それを除けば、単体テストで HttpContext をモックできます。HttpContext.Currentにはセッターがあるので、 mock/stub に設定してHttpContextBaseください。NUnit でNSubstituteを使用する例を次に示します。

[TearDown]
public void CleanUp()
{
    HttpContext.Current = null;
}

[Test]
public void FakeHttpContext()
{
    var context = Substitute.For<HttpContextBase>();
    var request = Substitute.For<HttpRequestBase>();
    context.Request.Returns(request);
    //Do any more arragement that you need.

    //Act

    //Assert
}

ただし、これはコードの匂いが少しします。依存関係の依存関係をテストしています(または、うさぎの穴がどこまでも進んでいます)。ただし、リファクタリングがオプションではない場合に役立ちます。

于 2012-05-23T15:06:24.143 に答える
1

OpenIdRelyingParty の HttpContext をモックするには、そのクラスのコードを変更する必要があります。シールされたクラスであるため、モックするのに時間を無駄にすることもあります(ただし、 MOCKWCFを使用できることは不可能ではありません)。

OpenIdRelyingPartyのラッパーまたはアダプターを作成する方がよいと思います 。お気に入り:

public class OpenIdRelyingPartyWrapped
{
    private OpenIdRelyingParty openIdRelyingPartyTarget;
    ....
    public virtual IAuthenticationRequest CreateRequest(string text)
    {
        return this.openIdRelyingPartyTarget.CreateRequest(text);
    }
    ...
} 

その後、必要に応じてモックすることができます。

于 2012-05-23T15:35:29.020 に答える
1

OpenIdRelyingPartyHttpRequestBase完全にモック可能な を受け入れるメソッド オーバーロードを使用して単体テストで使用できます。それをパラメーターとしてとらないメソッドのみがHttpContext.Current.

于 2012-05-25T05:33:34.960 に答える