簡體   English   中英

如何將模擬對象分配給控制器中的對象?

[英]How to assign a mocked object to a object in controller?

我有一個包含business類的控制器,該business類內部具有對datahandler依賴關系。 為了測試該業務類我需要模擬datahandler 設置完成后,我datahandler分配業務類的datahandler 但是,在調試時,公務艙datahandler正顯示出空,我知道,我應該使用構造注入嘲笑object.But是有可能做到這一點,而無需使用任何構造器注入?任何機構可以幫助我?

我的商務艙:

public class FooBusiness
{
  public static BarDataHandler _barDatahandler = new BarDataHandler();
  ...
}

測試類別:

public class FooBusinessTest
{
  ...
  _mockedBarDataHandler = new Mock<IBarDataHandler>(){CallBase:true};

   public FooTestMeth()
   {
    //Arrange
    _mockedBarDataHandler.Setup(x=>x.Search(It.IsAny<int>).Returns(1);
    ...
    FooBusiness _fooBusiness = new FooBusiness();

    FooBusiness._barDatahandler = _mockedBarDataHandler.Object;

    //Act
    ...
   }
}

您需要將dataHandler依賴項注入FooBusiness

如果不存在,則需要為BarDataHandler提取一個接口。

interface IBarDataHandler
{
  string GetUserToken(int id);
}
public class BarDataHandler : IBarDataHandler
{
  public string GetUserToken(int id)
  {
     // to do :read from db and return
  }
}

並向FooBusiness類添加一個構造函數,該構造函數接受IBarDataHandler的實現。

public class FooBusiness
{
  IBarDataHandler barDataHandler;
  public FooBusiness(IBarDataHandler barDataHandler)
  {
    this.barDataHandler=barDataHandler
  }
  public string GetUserToken(int id)
  {
    return this.barDataHandler.GetUserToken(id);
  }
}

您可以使用任何一種依賴項注入框架(例如Unity / Ninject / StructureMap)來在應用運行時解析您的具體實現。

您可以使用任何模擬框架(例如Moq)在單元測試中模擬IBarDataHandler的虛假實現。

如前所述,有多種方法可以滿足您的需求。 我個人更喜歡Shyju的答案(構造函數注入),但是如果您不能更改構造函數,那么以后仍然可以通過設置屬性來更改實現:

商務課程:

public class FooBusiness
{
    private IBarDataHandler _barDatahandler = new BarDatahandler();

    public IBarDataHandler BarDatahandler
    {
        get { return _barDatahandler; }
        set { _barDatahandler = value; }
    }

    public int Search(int a)
    {
        return _barDatahandler.Search(a);
    }
}

測試類別:

public class FooBusinessTest
{
    _mockedBarDataHandler = new Mock<IBarDataHandler>(){CallBase:true};

    public FooTestMeth()
    {
        //Arrange
        _mockedBarDataHandler.Setup(x => x.Search(It.IsAny<int>).Returns(1);

        FooBusiness fooBusiness = new FooBusiness();
        fooBusiness.BarDatahandler = _mockedBarDataHandler.Object;

        //Act
    }
}

如果您擔心重構實現,最好先設置所有測試。 之后,您可以以更安全的感覺進行重構:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM