【问题标题】:How to mock a return value?如何模拟返回值?
【发布时间】:2015-12-15 18:54:12
【问题描述】:

我有一堂课:

 public class BankingTransfer : IBankingTransfer
 {
    public decimal GetTrustAccountBalance(string Id, string Pin)
    {
        throw new NotImplementedException();
    }

现在我想对其进行 xunit 测试。但不确定如何测试虚拟返回值?

我的代码:

 public class GetTrustAccountBalanceUnitTest
 {
    [Theory]
    [InlineData("1234")]
    [InlineData("1234")]
    public void GetTrustAccountBalance_Should_Return_A_Value(string expectedId,string expectedPin)
    {
        // ARRANGE
        var bankingTransferMock =new Mock<IBankingTransfer>();
        // ACT
        bankingTransferMock.Setup(x=>x.GetTrustAccountBalance(expectedId,expectedPin)).Returns()
        // ASSURE
    }
}

【问题讨论】:

  • .Returns(42m)?你的问题是什么,这段代码的输出是什么,你尝试了什么?模拟被测类也是没有意义的。你将测试起订量,而不是你的班级。
  • 我没有该类的实际实现。一开始,如何测试呢?我不在乎返回值。
  • 那你为什么要在你的问题中要求返回值?你想具体测试什么?我可以建议阅读一本关于单元测试基础的书吗?可以这么说,您提出了错误的问题,这要求回答者涵盖单元测试基础知识,这使得问题过于宽泛。
  • 因为方法返回一个值。该方法不是无效方法。如果它是无效的,我会使用bankingTransferMock .Verify()
  • 是的,但是你又在嘲笑被测类。一开始就错了,所以剩下的问题恐怕没有多大意义。

标签: c# moq xunit


【解决方案1】:

只需在返回值中添加一个值,如下所示:

bankingTransferMock.Setup(x=>x.GetTrustAccountBalance(expectedId,expectedPin)).Returns(1);

但是,我认为您误解了如何测试您显示的课程。您不应该嘲笑您要测试的课程。根据测试名称,您可能需要更多类似这些行的东西,您只是调用方法并查看返回的内容。

var bankingTransfer = new BankingTransfer();
Assert.True(bankingTransfer.GetTrustAccountBalance("", "") > 0);

【讨论】:

  • 我的意思是我真的不想将1234 用作IdPin。我想嘲笑他们。
  • 我不认为你需要模拟一个字符串对象,因为它是一个非常简单的类型,只需传入实际的字符串。
猜你喜欢
  • 1970-01-01
  • 2020-04-06
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多