Moq
Entity Framework Code First クラスのテストを作成するために使用しようとしています。私は Moq とモッキング手法に非常に慣れていないため、以下で説明するテストを簡単に実行できるかどうか疑問に思っています。いくつかの解決策を Web で検索しましたが、ほとんどは避けたいリポジトリ パターンに基づいています。
ITestEntities
コンテキスト用のインターフェースがあります
public interface ITestEntities
{
IDbSet<Order> Orders { get; }
IDbSet<Product> Products { get; }
IDbSet<User> Users { get; }
}
次にコンテキスト
public class TestEntities : DbContext, ITestEntities
{
public TestEntities() : base("name=TestEntities")
{
}
public virtual IDbSet<Order> Orders { get; set; }
public virtual IDbSet<Product> Products { get; set; }
public virtual IDbSet<User> Users { get; set; }
}
テストするコントローラーとアクション
public class HomeController : Controller
{
private ITestEntities db;
public HomeController()
{
db = new TestEntities();
}
public HomeController(ITestEntities db)
{
this.db = db;
}
public ActionResult Index()
{
var count = db.Users.Count();
ViewBag.count = count;
return View(count);
}
}
最後に、Moq を使用した NUnit テスト
[Test]
public void ModelValueShouldBeTwo()
{
var mockUsers = new Mock<IDbSet<User>>();
mockUsers.Setup(m => m.Count()).Returns(2);
var mockDB = new Mock<ITestEntities>();
mockDB.Setup(db => db.Users).Returns((IDbSet<User>)mockUsers);
var controller = new HomeController((ITestEntities)mockDB);
var view = controller.Index();
Assert.IsInstanceOf<ViewResult>(view);
Assert.AreEqual(((ViewResult)view).Model, 2);
}
問題は次の行にあります: mockUsers.Setup(m => m.Count()).Returns(2);
. このテストを実行すると、次のエラーが発生します。
System.NotSupportedException : Expression references a method that does not belong to the mocked object: m => m.Count<User>()
これは.Count()
静的メソッドであるため、Moq でモックできないためだと思います。本格的なリポジトリ パターンを使用せずに Moq を使用してこの単純なアクションをテストする方法はあり.Count()
ますか? これは非常にシンプルで、EF Code First で可能であるという印象を持っているからです。