为了账号安全,请及时绑定邮箱和手机立即绑定

如何为类中的方法编写单元测试,但不调用 C# 中的类的构造函数

如何为类中的方法编写单元测试,但不调用 C# 中的类的构造函数

C#
蓝山帝景 2021-12-05 16:59:43
我想MethodA在class A. 但是,我真的不想MethodB在构造 时调用A,因为它需要很多时间来处理。有什么办法可以处理吗? MethodB需要在其他任何事情之前调用,所以我不能将它移出 ctor(它初始化listA,listB和listC字段)。我不知道如何为此使用模拟框架。public Class A {  List<int> listA;  List<int> listB;  List<int> listC;  public A()  {          MethodB();    // Long processing.  }  public List<int> GetA()  {      return listA;  }   public List<int> GetB()  {      return listB;  }   public List<int> GetC()  {      return listC;  }   private void MethodB()  {      // Expensive initialization of list fields.  }  public bool MethodA(customerCollection foo)  {        for (int i = 0; i < customerCollection .Count; i++)        {            if (customerCollection[i].Name == "Something")            {                return true;            }        }      return false;  }}
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

据我所知,您MethodA不需要A实例即可运行,因此您可以将其更改为static并在没有A实例的情况下对其进行测试。但请注意,从 OOP 的角度来看,此方法在A类中没有位置(单一职责原则),因此您需要进行一些重构。


查看完整回答
反对 回复 2021-12-05
?
慕沐林林

TA贡献2016条经验 获得超9个赞

虽然很清楚MethodAcan be static,但它不使用class我建议采用不同方法的任何字段,因为问题用moq和inversion-of-control标签标记。进行一些重新设计,您可以将其存档...例如,您可以通过IRepository界面公开列表,然后您可以利用 IoC 原则在单元测试中启用模拟。像这样的东西:


public interface IRepository

{

    void Init();

    IList<int> Get();

}


public Class A 

{    

  IRepository _aRepository;

  IRepository _bRepository;

  IRepository _cRepository;


  public A(IRepository aRepository, IRepository bRepository, IRepository bRepository)

  {

    _aRepository = aRepository;

    _bRepository = bRepository;

    _cRepository = cRepository;


     MethodB();

  }


  public IList<int> GetA()

  {

      return _aRepository.Get();

  } 


  public IList<int> GetB()

  {

      return _bRepository.Get();

  } 


  public IList<int> GetC()

  {

      return _cRepository.Get();

  } 


  private void MethodB()

  {

      _aRepository.Init();

      _bRepository.Init();

      _cRepository.Init();

  }


  public bool MethodA(customerCollection foo){...whatever...}

}

然后在单元测试中,您可以模拟您的存储库并利用 Moq 库


Mock<IRepository> aRepositoryMock = new Mock<IRepository>();

Mock<IRepository> bRepositoryMock = new Mock<IRepository>();

Mock<IRepository> cRepositoryMock = new Mock<IRepository>();


aRepositoryMock.Setup(m => m.Init)...setup Callback for example

aRepositoryMock.Setup(m => m.Get()).Returns(...some list...)


...aslo you can setup b and c repositories...


var sut = new A(aRepositoryMock.Object, bRepositoryMock.Object, cRepositoryMock.Object);


查看完整回答
反对 回复 2021-12-05
  • 2 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信