如何在C#

时间:2018-09-07 10:48:32

标签: c# mocking nunit moq

我在Nunit测试用例中无缘无故地在互联网上浏览模拟基类成员,并最终决定要求这个废料来堆积溢出社区。

下面的代码段在我的应用程序中有场景。我要为BankIntegrationController类编写单元测试,我想对IsValid属性和Print方法进行存根数据或模拟。

框架:Moq,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
    }
}

2 个答案:

答案 0 :(得分: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>。)

答案 1 :(得分:-1)

假设您的IsValid属性是IController接口的一部分,则可以Moq多个接口,如下所示:

var bankController = new Mock<IBankIntegration>();
var cController = cController.As<IController>();
cController.SetupGet(m => m.IsValid).Returns(true);

Miscellaneous section of the Moq Quick Start中对此进行了说明。