gpt4 book ai didi

asp.net-mvc - 如何将 Moq 与 Entity Framework IDbSet Count() 等方法一起使用

转载 作者:行者123 更新时间:2023-12-01 19:12:12 25 4
gpt4 key购买 nike

我正在尝试使用Moq对 Entity Framework Code First 类进行一些测试。我对起订量和模拟技术非常陌生,我想知道是否可以轻松地进行我将在下面描述的测试。我在网上搜索了一些解决方案,但大多数都是基于存储库模式,我想避免这种情况。

我有ITestEntities上下文接口(interface)

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; }
}

Controller 和要测试的操作

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 实现。

最佳答案

如果您正在模拟测试实体,则无需进一步模拟链下

类似的事情应该做(尽管我不在 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);
}

这意味着扩展方法将仅根据您提供的测试数据工作。

请参阅下面有关模拟 dbset 的好文章 http://geekswithblogs.net/Aligned/archive/2012/12/12/mocking-or-faking-dbset.aspx

关于asp.net-mvc - 如何将 Moq 与 Entity Framework IDbSet Count() 等方法一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16210363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com