簡體   English   中英

NUnit-靜態Vs。 公開方法

[英]NUnit - Static Vs. Public methods

我的項目規模和功能都在不斷增長,所以我決定使用NUnit測試某些功能,但是我面臨的問題是大多數方法都是靜態的,所以我首先想到的是創建公共方法,而我從Unit Test類調用它們,但是那些公共方法開始很多,所以我想知道是否應該在主類中創建接口而不是在主類中創建新的Public方法,還是將靜態方法設為Public並使用中級班。

這是我的程序的結構示例,

namespace Mynamespace
{
    public class Foo
    {
         InsertUser();
         SortUser();
    }

    static void InsertUser()
    {

    }

    static void SortUser()
    {

    }

    //Here start the public methods to be called from the unit test class

    public DoSort() 
    {
        InsertUser();
        SortUser();
    }
}

將我的程序和測試類的主要邏輯分開的最佳方法是什么?

謝謝,

與其保留靜態方法並添加非靜態方法,不如將所有方法從靜態方法轉換為實例方法並提取Foo類的客戶端將依賴的抽象:

public interface IFoo
{
     void InsertUser();
     void SortUser();
}

public class Foo : IFoo
{
     void InsertUser() { ... }
     void SortUser() { ... }
}

靜態成員將耦合引入您的應用程序。 嘲笑靜態成員實在令人頭疼。 您應該對抽象進行編程,而不是對實現進行編程,以使您的代碼可測試且松耦合 當您的代碼依賴於接口而不是靜態類時,您可以輕松地模擬此依賴關系:

Mock<IFoo> fooMock = new Mock<IFoo>();
fooMock.Setup(f => f.InsertUser()).Throws<InvalidOperationException>();

var sut = new ClassUnderTest(fooMock.Object);
fooMock.VerifyAll();

而且,如果您確實需要在全局范圍內訪問這些方法(這不是一個好主意-這是一種程序化的編程風格),則將您的類實現為Singleton

public class Foo : IFoo
{
     public static Foo Instance = new Foo(); // simple singleton implementation
     private Foo() { }

     void InsertUser() { ... }
     void SortUser() { ... }
}

您將可以在應用程序中的任何位置獲取類實例

IFoo foo = Foo.Instance;
foo.SortUser();

我認為,您應該讓您的真實類和單元類都實現一個通用接口,如下所示:

interface IFoo
{
    void InsertUser();
    void SortUser();
}

對於您的實際實現,請使用以下命令:

public class RealFoo : IFoo
{
    public void InsertUser()
    {
        throw new NotImplementedException();
    }

    public void SortUser()
    {
        throw new NotImplementedException();
    }
}

對於測試類,請使用以下命令:

public class FakeFoo : IFoo
{
    public void InsertUser()
    {
        throw new NotImplementedException();
    }

    public void SortUser()
    {
        throw new NotImplementedException();
    }
}

注意:您FakeFoo類不需要在同一地點為您的存在RealFoo類,而是你IFoo接口定義應該由每個項目(一個真正的實現和其他的測試項目)的引用。

如果您的IFoo接口太大(閱讀:過多的方法),那么您可以使用Repository Pattern ,它將把您的方法更多地按照功能划分為接口。

暫無
暫無

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

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