1

リポジトリインターフェイスに次のメソッドがあります。

IQueryable<T> GetQuery<T>(Expression<Func<T, bool>> predicate) where T : class;

次のコンストラクターを使用した単体テストで実行するクラスがあります。

public MyClass(IUnitOfWork unitOfWork)

インターフェイスIUnitOfWorkには、公開されたリポジトリプロパティがあります。

Repository Repository { get; }

だから私は次のMyClass.DoSomething()ようにメソッドをユニットテストしようとしています:

[TestInitialize]
public void Setup()
{

    accounts = new List<Account>()
    {
        new Account()
            {
               Id = 123
            }
    };
}

次に、Arrange失敗しているユニットテストセクションがあります。

//Arrange
var repositoryMock = new Mock<IUnitOfWork>();
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123))
                           .Returns(accounts.AsQueryable()); //This setup always fails
var myClass = new MyClass(repositoryMock.Object); //don't even get here

私が得る例外は次のとおりです。

System.NotSupportedException:非仮想(VBでオーバーライド可能)メンバーの無効なセットアップ:x => x.Repository.GetQuery(y => y.Id == 123)

私はSetupモックの他のバリエーションを試しました:

repositoryMock.Setup(x => x.Repository.GetQuery<Account>()).Returns((Account a) => accounts.AsQueryable().Where(z => z.Id == 123));

repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123)).Returns((Account a) => accounts.AsQueryable().Where(z => z == a));

しかし、成功しませんでした。毎回同じ例外が発生します。単体テストを実行すると、常に同じ例外がスローされます。嘲笑されるインターフェイスを使用しているのに、なぜこの例外が発生するのですか、またこれを適切に行うにはどうすればよいですか?ありがとう!

4

2 に答える 2

2

現在の設定の代わりに、これを試してください。

//Arrange
var repositoryMock = new Mock<IUnitOfWork>();
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(
        It.IsAny<Expression<Func<T, bool>>>());
    .Returns(accounts.AsQueryable()); // This should not fail any more
var myClass = new MyClass(repositoryMock.Object); 

実際には、どちらの方法でもリストを返すため、具体的なラムダを渡す必要はありません。

于 2013-03-01T22:41:07.587 に答える
1

表示したRepositoryプロパティは、インターフェイスタイプではありません。それはいくつかの具体的なクラスです。また、エラーメッセージに示されているように、非仮想メソッドに対する期待値を定義することはできません。したがって、代わりに、抽象化をモックできるようにしたい場合は、抽象化を使用する必要があります。

IRepository Repository { get; }
于 2013-03-01T22:40:59.187 に答える