3

Moq を使用してこのオブジェクトをモックするために、どのような回避策がありますか。返されるエラー メッセージは次のとおりです。

        var st = new Mock<X509SecurityToken>();
        st.SetupGet(p => p.Certificate.SubjectName.Name).Returns("test1");
        var target = new X509IssuerNameRegistry("test1", "test2");

        var actual = target.GetIssuerName(st.Object);

        Assert.AreEqual<string>("test1", actual, "Actual security token did not equal expected security token");

注: X509SecurityTokenをモックしようとしています。テスト対象のクラスは次のとおりです。

public class X509IssuerNameRegistry : IssuerNameRegistry { readonly List _trustedSubjectNames = new List();

public X509IssuerNameRegistry(params string[] trustedSubjectNames)
{
    _trustedSubjectNames = new List<string>(trustedSubjectNames);
}

public override string GetIssuerName(SecurityToken securityToken)
{
    var x509Token = securityToken as X509SecurityToken;
    if (x509Token != null)
    {
        if (_trustedSubjectNames.Contains(x509Token.Certificate.SubjectName.Name))
        {
            return x509Token.Certificate.SubjectName.Name;
        }
    }
    throw new SecurityTokenException("Untrusted issuer.");
}

}

これ(Moqを使用)の回避策はありますか、それともこれを達成するために別のモックフレームワークに目を向けるべきですか?

4

2 に答える 2

2

いいえ、Moq (継承クラスと同様) は非仮想メソッドをオーバーライドできないため、(クラスを変更またはラップすることによって) Name を仮想プロパティにできない限り、Moq でモックすることはできません。

可能であれば、プロパティを仮想に変更することをお勧めします。これにより、任意のモッキング フレームワークを使用できるようになります。私の知る限り、非仮想メソッドをモックできるのは 3 つだけで、どれも無料ではありません。

于 2012-09-17T04:35:16.987 に答える
0

単純にモックできない (つまり、仮想メソッドが含まれていない/インターフェイスではない) コードを「ハック」できるフレームワークを探すことができますが、それはやり過ぎになる可能性があります (また、TypeMock Isolatorのように一部のオプションは無料ではありません)。例)。

より簡単なアプローチは、次のように抽象化することX509SecurityTokenです。

interface ISecurityToken
{
    string SubjectName { get; }
    // ...
}

次に、上で指定したインターフェースも実装するラッパーを実装します。

class SecurityToken : ISecurityToken
{
    X509SecurityToken token;
    public SecurityToken(X509SecurityToken token)
    {
        this.token = token;
    }
    public string SubjectName { get { return token.SubjectName.Name; } }
}

次に、コード全体で、ISecurityTokenの代わりにインターフェースを使用する必要がありますX509SecurityToken。これは、モックするのがかなり簡単です。

于 2012-09-17T04:34:36.333 に答える