簡體   English   中英

如何存根DbSet.Find

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM