1

テストに役立つモックを提供しようとしています:

ClaimsPrincipal princple = Thread.CurrentPrincipal as ClaimsPrincipal;

ただし、デバッガーで Thread.CurrentPrincipal がモックであることがわかりますが、「as」キーワードは null を返します。

理論をテストするために、この短いデモをまとめました。

void Main()
{
    var userMock = new Mock<IUser>();
    userMock.Setup(w => w.UserId).Returns(1);

    var user = userMock.Object as User;

    user.Dump(); // null

}

public interface IUser
{
    int UserId { get; set; }
}

public class User : IUser
{
    public int UserId { get; set; }
}

バックグラウンドで as キーワードを使用するコードに moq を提供するにはどうすればよいですか?

私が理解していることから、おそらくプロキシがキャストバックする方法を提供する必要がありますか?

これは不可能だと思いますが、これを解決するために人々がどのようなアプローチをとっているのか疑問に思いました。

4

2 に答える 2

3

モックを作成するとき

var userMock = new Mock<IUser>();

次に、Moq はIUserインターフェイスを実装するクラスを動的に作成します。そのクラスは、このインターフェースの他の実装 (Userクラスなど) とは関係ありません。そのため、モック オブジェクトはありますがIUser、そうではありませんUser

var user = userMock.Object as User; // will be null
于 2014-02-25T14:49:29.797 に答える
2

回避策を見つけたと思います。インターフェースに対してモックを作成する必要があり、具体的なクラスをモックするべきではないことを理解していますが、依存関係をリファクタリングできるようになるまで、これを行う必要がある場合があります。

トリックは、コンクリートをモックし、class Mock<User>()を使用しAs<IUser>()てプロパティなどをモックすることです。

void Main()
{
    var userMock = new Mock<User>();
    userMock.As<IUser>().Setup(w => w.UserId).Returns(1);

    var user = userMock.Object as User;

    user.Dump(); // not null
}

public interface IUser
{
    int UserId { get; set; }
}

public class User : IUser
{
    public int UserId { get; set; }
}

過去にインターフェースを常に嘲笑してきたので、これを試していなかったと思います。

于 2014-02-25T15:01:35.360 に答える