[英]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.