【问题标题】:unit testing the commandhandler depended on Interface单元测试命令处理程序依赖于接口
【发布时间】:2020-01-24 13:28:51
【问题描述】:

我不太习惯编写单元测试。很抱歉问了一些基本问题。

这里是命令处理程序

ICalculateAge CalculateAge { get; set; }

public UpdateAgeCommandHandler(ICalculateAge calculateAge)
{
    this.CalculateAge = calculateAge;
}

我想对此进行单元测试,所以我在我的测试项目中尝试了下面的cs文件:

UpdateAgeCommandHandler cmd1 =  new UpdateAgeCommandHandler());

但它不起作用,因为我没有通过接口。这个接口怎么传?

【问题讨论】:

  • 我真的不明白你的问题。你需要传递一个实现ICalculateAge的对象。

标签: c# asp.net nservicebus


【解决方案1】:

你不能传递接口,因为接口只是为了标准化。

你应该通过接口的实现。实现是指实现ICalculateAge的类。

Documentation on interface

This blog 举个例子来解释完全相同的场景。可能对你有帮助。

在这个博客中,他们使用 Moq 框架来模拟界面。 他们还设置了在模拟对象上调用方法时应该返回的内容。

var mockFinancialService = new Mock<IFinancialService>();
mockFinancialService.Setup(x => 
     x.GetFinancialScore(balance)).Returns(expected);

然后他们将模拟对象传递给类而不是接口。

var account = new BankAccount(mockFinancialService.Object);
account.PutMoney(balance);

以上所有步骤都在安排单元测试所需的所有内容。 接下来,您只需调用实际方法并验证结果。

// Act
string actual = account.GetFinancialScore();

// Assert
Assert.AreEqual(actual, expected);

与此类似,您需要从接口设置模拟,前提是您不想测试接口的实际实现。

【讨论】:

  • 从您提供的链接中,那个人创建了单元测试并编写了这个 var orderManager = new OrderManager(stub);但是 OrderManager 类期望 ICounter 作为参数。那么它是如何工作的呢?
  • 在答案中添加了详细信息。
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多