【问题标题】:How to Mock Base Class Property or Method in C#如何在 C# 中模拟基类属性或方法
【发布时间】:2018-09-07 19:34:44
【问题描述】:

我在网上浏览 Nunit 测试用例中的模拟基类成员,但没有运气,最后决定将这个废料堆到溢出社区。​​p>

下面的代码 sn-p 在我的应用程序中有场景。我将为 BankIntegrationController 类编写单元测试,我想为 IsValid 属性和 Print 方法制作存根数据或模拟。

框架:最小起订量,Nunit

public class CController : IController
{
     public bool IsValid {get;set;}

     public string Print()
     {
            return  // some stuff here;
     }
}

public class BankIntegrationController : CController, IBankIntegration
{
    public object Show()
    {
       if(this.IsValid)
       {
          var somevar = this.Print();
       }

       return; //some object
    }
}

【问题讨论】:

  • 这只是一个简单的属性——为什么还要嘲笑它呢?只需将一个测试的值设置为 true,将另一个测试设置为 false。
  • @DaisyShipton 因为如果他们在模拟控制器接口,就没有具体的实现。
  • @OwenPauling:但这不是描述的情况:“我要为 BankIntegrationController 类编写单元测试”——具体实现。
  • @DaisyShipton 公平点。在这种情况下,他们根本不应该在这里使用 Moq。所以当他们试图模拟 IBankIntegration 时,我接受了这个问题。
  • @OwenPauling:我同意他们不应该在这里使用嘲笑,因此我的评论。但我认为这个问题已经很清楚了。

标签: c# mocking nunit moq


【解决方案1】:

你不需要嘲笑任何东西。只需在调用Show之前设置属性:

[Fact]
public void Show_Valid()
{
    var controller = new BankIntegrationController { Valid = true };
    // Any other set up here...
    var result = controller.Show();
    // Assertions about the result
}

[Fact]
public void Show_Invalid()
{
    var controller = new BankIntegrationController { Valid = false };
    // Any other set up here...
    var result = controller.Show();
    // Assertions about the result
}

当您想要指定依赖项在特定场景中的行为方式时(尤其是当您想要验证代码如何与其交互时),模拟是一种非常有价值的技术,但在这种情况下您不需要 任何依赖项(你已经向我们展示了)。我观察到很多开发人员在三种情况下不必要地使用模拟:

  • 当不涉及依赖(或其他抽象行为)时,例如这种情况
  • 当手写的假实现会导致更简单的测试时
  • 当现有的具体实现更易于使用时。 (例如,您很少需要模拟 IList<T> - 只需在测试中传入 List<T>。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多