我發現自己陷入這種模式很多,我寫了一個由非常小的方法組成的類,這些方法完全由我的單元測試執行。然後我發現我需要建立調用這些方法的另一種方法,我必須寫一個更復雜的單元測試爲 - 一個簡單的例子是說明:測試內部方法的單元測試公共方法
namespace FooRequest
{
static public class Verifier
{
static public bool IsValid(string request)
{
return (!IsAllCaps(request) && !ContainsTheLetterB(request));
}
static internal bool IsAllCaps(string request)
{
return (request.Equals(request.ToUpper()));
}
static internal bool ContainsTheLetterB(string request)
{
return request.ToLower().Contains("b");
}
}
}
對於代碼,我會寫單元測試覆蓋兩個內部方法是這樣的:
namespace UnitTest
{
using Microsoft.VisualStudio.TestTools.UnitTesting;
using FooRequest;
public class VerifierTest
{
[TestClass]
public class ContainsTheLetterB
{
[TestMethod]
public void ShouldReturnTrueForStringContainsB()
{
Assert.IsTrue(Verifier.ContainsTheLetterB("burns"));
}
[TestMethod]
public void ShouldReturnFakseForStringDoesNotContainB()
{
Assert.IsFalse(Verifier.ContainsTheLetterB("urns"));
}
}
[TestClass]
public class IsAllCaps
{
[TestMethod]
public void ShouldReturnTrueForStringIsAllCaps()
{
Assert.IsTrue(Verifier.IsAllCaps("IAMALLCAPS"));
}
[TestMethod]
public void ShouldReturnFakseForStringDoesNotContainB()
{
Assert.IsFalse(Verifier.IsAllCaps("IAMnotALLCAPS"));
}
}
}
}
對於公衆方法我真的只是想測試,「如果你調用的方法返回false,則返回false」 - 這很煩人,我必須建立在這樣的輸入一種強制我的內部方法返回true或false的方法 - 我對這個方法的測試不應該關心它調用的內部方法(對吧?)
[TestClass]
public class IsValid
{
[TestMethod]
public void ShouldReturnFalseForInvalidStringBecauseContainsB()
{
Assert.IsFalse(Verifier.IsValid("b"));
}
[TestMethod]
public void ShouldReturnFalseForInvalidStringBecauseIsAllCaps()
{
Assert.IsFalse(Verifier.IsValid("CAPS"));
}
[TestMethod]
public void ShouldReturnTrueForValidString()
{
Assert.IsTrue(Verifier.IsValid("Hello"));
}
}
顯然,在這個例子中,這是不是太糟糕,但是當有很多的內部方法和輸入是不平凡的配置,測試我的公開「就是這個輸入有效」的方法變得複雜。
我應該爲我的所有內部方法創建一個接口,然後將其存儲到測試中,還是有一個更好的方法?
這似乎表明,應該有一個且只有一個方法在一個類 - 是否正確? –
我想說的是,一般而言,在單一課堂中應該只有一種** public **方法(參見[SRP](http://en.wikipedia.org/wiki/Single_responsibility_principle))。 – seldary
有趣的 - 我認爲我的原始示例類驗證程序不違反SRP,它做了一件事(驗證字符串)。 另外,你所建議的方法似乎會導致一個類的所有內部方法被拉出多個類的單個公共方法 - 我相信這意味着我們放棄了類支持的內聚,也許還有更好的方法? –