如何填充只读接口集合

时间:2015-06-28 14:24:20

标签: c# unit-testing collections

我有一项任务,我需要完成以下单元测试(我无法修改)才能通过。

[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个?

1 个答案:

答案 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