我发现自己陷入这种模式很多,我写了一个由非常小的方法组成的类,这些方法完全由我的单元测试执行。然后我发现我需要建立调用这些方法的另一种方法,我必须写一个更复杂的单元测试为 - 一个简单的例子是说明:测试内部方法的单元测试公共方法
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,它做了一件事(验证字符串)。 另外,你所建议的方法似乎会导致一个类的所有内部方法被拉出多个类的单个公共方法 - 我相信这意味着我们放弃了类支持的内聚,也许还有更好的方法? –