[英]How to stub DbSet.Find
// acknowledgement: http://stackoverflow.com/a/5022512/1500199
public class FakeDbSet<T> : IDbSet<T> where T : class
{
private readonly HashSet<T> data;
private readonly IQueryable query;
public FakeDbSet()
{
data = new HashSet<T>();
query = data.AsQueryable();
}
public virtual T Find(params object[] keyValues)
{
throw new NotImplementedException();
}
}
我该如何实现Find
?
我需要确定T
的主键值,以便在Find
方法中执行键值比较,但我不知道如何。
尝试这个:
public class FakeDbSet<T> : IDbSet<T> where T : class
{
private Func<T, object[], bool> _findSelector
private readonly HashSet<T> data;
private readonly IQueryable query;
public FakeDbSet(Func<T, object[], bool> findSelector)
{
_findSelector = findSelector;
data = new HashSet<T>();
query = data.AsQueryable();
}
public virtual T Find(params object[] keyValues)
{
return _data.SingleOrDefault(item => _findSelector(item, keyValues));
}
}
如果我理解正确您需要存储DbSet对象的Find()方法以进行单元测试。
如果您正在使用具有版本6或更高版本的EntityFramework并使用模拟框架(如Moq或NSubstitute或FakeItEasy),则无需编写类似FakeDbSet的类就可以轻松实现此目的。
本文提供了存根/模拟过程的完整说明: http : //msdn.microsoft.com/en-us/data/dn314429.aspx
以及使用本文中的类的示例。
[Test]
public void Foo_WhenCalled_CallsDb()
{
//Arrange
var fakeDbSet = new Mock<DbSet<Course>>();
fakeDbSet.Setup(dbs => dbs.Find(It.IsAny<object>())).Returns(new Course { CourseID = 125 });
var fakeContext = new Mock<SchoolEntities>();
fakeContext.Setup(c => c.Courses).Returns(fakeDbSet.Object);
var foo = new Foo(fakeContext.Object);
//Act
string result = foo.MyMethod();
//Assert
Assert.AreEqual("125", result);
}
对于其他版本的EntityFramework,请考虑使用“Repository”模式 - 它提供了出色的测试功能。 我希望我的回答能帮到你。
覆盖该方法
public class FakePostsDbSet : FakeDbSet<Post>
{
public override Post Find(params object[] keyValues)
{
return this.SingleOrDefault(
post => post.Slug == (string) keyValues.Single());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.