0

对我的存储库接口进行了单元测试后,我现在正在对我的存储库实现进行单元测试。我发现我在嘲笑很多实施,这让我很舒服。一个例子如下:

Mock<SqlServerDatabaseContext> repoMock = new Mock<SqlServerDatabaseContext>();
repoMock.Setup(foo => foo.QuestionnaireResults).Returns(new List<QuestionnaireResult>() 
{
      new QuestionnaireResult() { Id = 1, Score = 2  },
      new QuestionnaireResult() { Id = 2, Score = 10 }
}.AsEnumerable());

repoMock.Setup(foo => foo.GetNumberOfResults()).Returns(2);

var average = repoMock.Object.CalculateAverage();

Assert.AreEqual(6d, average, "SqlRepository creativity average failed");

...实际实现如下所示:

public class SqlServerDatabaseContext 
{
    ... stuff omitted for brevity ...

    public virtual IEnumerable<QuestionnaireResult> QuestionnaireResults
    {
        get { return dbContext.QuestionnaireResults; }
    }

    public double CalculateAverage()
    {
        var testSum = QuestionnaireResults.Sum(foo => foo.Score);
        var numberOfRespondents = QuestionnaireResults.Count();
        return creativitySum / numberOfRespondents;
    }

  public virtual int GetNumberOfResults()
    {
        return QuestionnaireResults.Count();
    }
}

调用的 qa 数据库将在我个人控制之外增长和缩小,因此为了测试CalculateAverage 方法,我正在模拟尽可能多的实现,让我想知道这个测试中的值。鉴于我对嘲笑的经验不足,您认为上述方法是一种有效的方法,还是您能指出我更好的方法?

先感谢您。

4

2 回答 2

3

我想说,如果它执行该CalculateAverage方法,并且您的设置返回数据以允许调用CalculateAverage独立运行,那么您就完成了单元测试。但考虑到这一点...

你有这个SqlServerDatabaseContext你正在嘲笑它的全部。在其中您有一个名为 的成员dbContext。从您的示例来看,似乎不清楚它的来源。但这dbContext实际上是为您的CalculateAverage. 为什么不嘲笑dbContext

// arrange
var dbContext = new Mock<WhatEverThisContextClassIs>();
dbContext.Setup(foo => foo.QuestionnaireResults)
         .Returns(new List<QuestionnaireResult() 
{
    ...
});

var repo = new SqlServerDatabaseContext(dbContext);

// act
var result = repo.CalculateAverage();

// assert
reshult.Should().Be(6)

所以...

  1. 你遵循安排/行动/断言范式
  2. 您在构造函数中将上下文传递给存储库,存储库将其自身用于依赖注入,而 DI 几乎与 TDD 齐头并进
  3. 断言可能不熟悉,请查看FluentAssertions。不错,但不是必需的。
于 2013-05-30T13:29:16.703 回答
0

扩展胡安所说的,你关心的断言是正确的部分是平均值,但是当你说:

    var average = repoMock.Object.CalculateAverage();

你要求你的起订量来做这项工作。因此,您并没有真正测试系统,只是测试了您的 Mock,如果有人要更改平均功能,这对您毫无帮助。

Juan 的测试所做的好处是,它使用模拟值作为输入来测试计算平均值的实际代码;使用传递给它的假场景/状态来测试真实代码。

于 2013-05-31T06:22:56.577 回答