我有一项任务,我需要完成以下单元测试(我无法修改)才能通过。
[Test]
public void TheJarShouldContain30SweetsWhenCreated()
{
IJarOfSweetsCreator jarOfSweetsCreator = new JarOfSweetsCreator();
IJarOfSweets jarOfSweets = jarOfSweetsCreator.Create();
const int expectedNumberOfSweets = 30;
int numberOfSweets = jarOfSweets.Count;
Assert.AreEqual(expectedNumberOfSweets, numberOfSweets);
}
虽然继续下去并不多,但JarOfSweetsCreator
有以下代码:
public class JarOfSweetsCreator : IJarOfSweetsCreator
{
public IJarOfSweets Create()
{
//throw new NotImplementedException();
}
}
和IJarOfSweets
有这个:
public interface IJarOfSweets : IReadOnlyCollection<ISweet>
{
void Shuffle ();
ISweet TakeSweetFromJar ();
}
我需要通过从IJarOfSweets
创建和计算30来进行测试。我不明白如何创建和计算30个接口实例,如果你只能有一个,但我知道这听起来很愚蠢。
我假设它与IReadOnlyCollection<ISweet>
界面的IJarOfSweets
部分有关,但我不知道如何使用它。 IJarOfSweets
是否像集合一样使用,还是会在此界面中创建集合?
如果它是一个只读集合,我该如何制作30个?
答案 0 :(得分:0)
有时,最好的办法是编写最少量的代码,以便让测试通过。这有助于您反思您的测试并确保您正在编写有用的测试。
目前,您的测试需要您做一些事情。它需要您实现Create
的{{1}}方法来返回实现JarOfSweetsCreator
的内容,并且当您检查它的IJarOfSweets
属性时,它要求返回的对象返回30。
第一步是创建一个实现接口的具体类Count
。 需要执行任何操作的方法是JarOfSweets
属性,因此该类看起来像这样:
Count
然后,您需要更新创建者以返回public class JarOfSweets : IJarOfSweets {
public void Shuffle()
{
throw new NotImplementedException();
}
public ISweet TakeSweetFromJar()
{
throw new NotImplementedException();
}
int IReadOnlyCollection<ISweet>.Count
{
get { return 30; }
}
IEnumerator<ISweet> IEnumerable<ISweet>.GetEnumerator()
{
throw new NotImplementedException();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
类的新实例。
JarOfSweets
这是为了让测试通过而需要完成的最小。实际上,当您编写更多测试/编写代码以使测试通过时,您可能希望在代码中继续执行更多操作。
正如Jon在评论中所说,public class JarOfSweetsCreator : IJarOfSweetsCreator
{
public IJarOfSweets Create()
{
return new JarOfSweets();
}
}
只是告诉你ReadOnlyCollection
需要实现某些功能(get count + get enumerator)。这并不意味着该集合实际上需要 readonly 。您可以使用任何内置集合类型来实现它,也可以自己编写。
重要的是要记住,当您知道实现接口的具体类型时,您还可以访问未在接口上定义的方法。因此,在您的JarOfSweets
例如,它需要知道JarOfSweetsCreator
实际实现类型,而不仅仅是接口才能实例化它。这意味着JarOfSweets
方法可以调用基础集合上的其他方法,如Create
方法。所以,假设你有一个实现Add
的{{1}}类,你最终会得到一个看起来更像这样的创建者:
Sweet
然后在ISweet
中,它可以简单地使用public class JarOfSweetsCreator : IJarOfSweetsCreator
{
public IJarOfSweets Create()
{
var jar = new JarOfSweets();
for (int i = 0; i < 30; i++)
{
jar.Add(new Sweet());
}
return jar;
}
}
并委派相关功能:
JarOfSweets