私はEF 4.1を使用してドメインモデルを構築しています。私は、検証(文字列のユーザーコード)メソッドでTaskクラスを持っており、それには私はそう、データベース内の有効なユーザーにユーザーコードマップを確認したい:Moq testing LINQ whereクエリ
public static bool Validate(string userCode)
{
IDbSet<User> users = db.Set<User>();
var results = from u in users
where u.UserCode.Equals(userCode)
select u;
return results.FirstOrDefault() != null;
}
私はIDbSetには問題を模擬しないように部品番号を使用することができます。しかし、どこの呼び出しとのトラブルに遭遇した:(そのメソッドをモックその後、LINQを実行し、オブジェクトを取得するためのServiceLocatorを使用して、例えば)間接のレベルを作成するよりも他の
User user = new User { UserCode = "abc" };
IList<User> list = new List<User> { user };
var users = new Mock<IDbSet<User>>();
users.Setup(x => x.Where(It.IsAny<Expression<Func<User, bool>>>())).Returns(list.AsQueryable);
Initialization method JLTi.iRIS3.Tests.TaskTest.SetUp threw exception.
System.NotSupportedException: System.NotSupportedException: Expression
references a method that does not belong to the mocked object:
x => x.Where<User>(It.IsAny<Expression`1>()).
私はどのように考えることはできませんこれをテストするには別の方法がありますが、別のレイヤーを導入する前に、方法がないことを確認したいと思います。そして、この種のLINQクエリが非常に頻繁に必要になることがわかります。そのため、サービスオブジェクトはすぐに制御不能になります。
何か魂が助けてもらえますか?ありがとう!
統合テストを書くのではなく単体テストでモックを使用してこれを取り除こうとする理由はありますか? – csano
ユニットEFをテストする必要はありません:) – Eranga
Validate()メソッドは実際には単純化されています。それは多くの議論を持ち、各議論はテストされます。いくつかは単純な範囲チェックであり、一部はDB存在チェック(ここではユーザコードなど)です。 –