Epi*_*dex 8 asp.net-mvc unit-testing entity-framework moq
我正在尝试使用MoqEntity Framework Code First类进行一些测试.我对Moq和模拟技术都很陌生,我想知道是否可以轻松地进行下面将要描述的测试.我在网上搜索了一些解决方案,但大多数是基于存储库模式,我想避免.
我有ITestEntities上下文的接口
public interface ITestEntities
{
IDbSet<Order> Orders { get; }
IDbSet<Product> Products { get; }
IDbSet<User> Users { get; }
}
Run Code Online (Sandbox Code Playgroud)
然后是背景
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; }
}
Run Code Online (Sandbox Code Playgroud)
控制器和要测试的动作
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);
}
}
Run Code Online (Sandbox Code Playgroud)
最后使用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);
}
Run Code Online (Sandbox Code Playgroud)
问题出在这一行: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.
Nin*_*Nye 16
如果您正在模拟测试实体,则无需在链中进一步模拟
这样的事情应该做(虽然,我不在IDE,所以可能需要一些调整)
更新以包含新的InMemoryDbSet
[Test]
public void ModelValueShouldBeTwo()
{
//Build test users
var mockUsers = new InMemoryDbSet<User>(){ new User(), new User()};
var mockDB = new Mock<ITestEntities>();
//Set up mock entities to returntest users.
mockDB.Setup(db => db.Users).Returns(mockUsers);
var controller = new HomeController((ITestEntities)mockDB);
var view = controller.Index();
Assert.IsInstanceOf<ViewResult>(view);
Assert.AreEqual(((ViewResult)view).Model, 2);
}
Run Code Online (Sandbox Code Playgroud)
这意味着扩展方法将简单地处理您提供的测试数据.
有关模拟dbset的好文章,请参见下文 http://geekswithblogs.net/Aligned/archive/2012/12/12/mocking-or-faking-dbset.aspx
| 归档时间: |
|
| 查看次数: |
9517 次 |
| 最近记录: |