具有复杂Linq查询的单元测试方法

时间:2016-05-09 21:11:57

标签: c# linq unit-testing entity-framework-6

我觉得我用这个程序打了一个砖墙。这是我第一次尝试对单元进行单元测试,而我是该团队的试验品。我的问题围绕Linq查询的单元测试方法,Linq查询调用多个实体。我想我已经想出如何使用单个实体对查询进行单元测试,但还没有得到多个。

示例代码:

    [TestMethod]
    public void BillsTest_GetOutStandingBills_DataIntegrity()
    {
        //Arrange
        var data = new MockData();
        var billCache = data.MockBillCache();

        //var mockSet = new Mock<DbSet<BillCache>>();
        //mockSet.As<IQueryable<BillCache>>().Setup(m => m.Provider).Returns(dataBillCache.Provider);
        //mockSet.As<IQueryable<BillCache>>().Setup(m => m.Expression).Returns(dataBillCache.Expression);
        //mockSet.As<IQueryable<BillCache>>().Setup(m => m.ElementType).Returns(dataBillCache.ElementType);
        //mockSet.As<IQueryable<BillCache>>().Setup(m => m.GetEnumerator()).Returns(dataBillCache.GetEnumerator());

        var mockSet = EntityFrameworkMoqHelper.CreateMockForDbSet<BillCache>()
                                        .SetupForQueryOn(billCache);


        //var mockContext = new Mock<BillPayContext>();
        //mockContext.Setup(m => m.BillCaches).Returns(mockSet.Object);

        var mockContext = EntityFrameworkMoqHelper.CreateMockForDbContext<BillPayContext, BillCache>(mockSet); 

        string SSN = "556-53-08";
        var DOB = DateTime.Parse("11/02/1961");
        int MN = 43760148;
        var mockBills = new Bills(mockContext.Object);

        //Act
        var result = mockBills.GetOutStandingBills(SSN, DOB, MN);
        var confirm = result.ToList();

        //Assert
        Assert.AreEqual(2, confirm.Count);


    }

待测试方法:

     public IEnumerable<BillCache> GetOutStandingBills(string SSN, DateTime DOB, int MN)
    {
        // Returns bills for the authenicated user by SSN and DOB or MRN and DOB
        IEnumerable<BillCache> outStandingBillsResult = null;
        if (!string.IsNullOrEmpty(SSN) && DOB > new DateTime(1753, 1, 1))
        {
            outStandingBillsResult = CoreBillQuery()
                    .Where(w => w.SSN == SSN && w.DateOfBirth == DOB ||
                            (w.AccountID == MRN && w.BillingSystemID == 9 && w.DateOfBirth == DOB));
        }

        return outStandingBillsResult;            
    }

1 个答案:

答案 0 :(得分:0)

看看FluentAssertions collection testing methods。这些使测试集合更容易。

BTW mockBills并非嘲笑,它是您正在测试的真实内容,所以我们通常不会这样命名。