2015-06-28 6 views
1

У меня есть задача, которую я должен выполнить, где мне нужно пройти следующий модульный тест (который я не могу изменить).Как заполнить сборку интерфейсов только для чтения

[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(); 
} 

мне нужно сделать тест пройти путем создания и считая 30 из IJarOfSweets. Я не понимаю, как создавать и считать 30 экземпляров интерфейса, если у вас есть только один, но я знаю, что это звучит глупо.

Я предполагаю, что это как-то связано с частью интерфейса IReadOnlyCollection<ISweet>, но я не знаю, как его использовать. Является ли IJarOfSweets как коллекция или я бы создал коллекцию в этом интерфейсе?

Если это коллекция только для чтения, как я могу сделать 30 из них?

+1

«Является ли IJarOfSweets используемого как коллекция» - да, именно поэтому он реализует '' IReadOnlyCollection ... это означало, которые будут использоваться в качестве коллекции конфет, хотя как ни странно с 'методом Shuffle' также. Честно говоря, если у вас возникли проблемы с этим, лучше спросить у вашего учителя более подробную информацию, так как это говорит о том, что вы, возможно, пропустили некоторые концепции. –

+0

Хорошо, но тогда как бы мне создать 30, если коллекция читается только? –

+0

IReadOnlyCollection - это плохое имя - интерфейс только предоставляет членам возможность читать коллекцию, а не мутировать ее. –

ответ

0

Иногда самое лучшее, что нужно сделать, это написать минимальный код, который вы можете выполнить, чтобы пройти тесты. Это поможет вам задуматься о своих тестах и ​​гарантирует, что вы пишете полезные тесты.

Как и все, ваш тест требует от вас нескольких вещей. Вам нужно реализовать метод CreateJarOfSweetsCreator, чтобы вернуть что-то, что реализует 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.

public class JarOfSweetsCreator : IJarOfSweetsCreator 
{ 
    public IJarOfSweets Create() 
    { 

     return new JarOfSweets(); 
    } 
} 

Это минимум, что должно быть сделано, чтобы получить тест пройти. На самом деле, вы, скорее всего, захотите сделать немного больше с продвижением кода, поскольку вы пишете больше тестов/пишете код, чтобы пройти тесты.

Как сказал Джон в комментариях, ReadOnlyCollection, просто сообщает вам, что JarOfSweets необходимо реализовать определенные функции (получить счетчик + получить перечисление). Это не означает, что коллекция действительно должна быть readonly. Вы можете реализовать его, используя любой из встроенных типов коллекций, или можете написать свой собственный.

Важно помнить, что, когда вы знаете конкретный тип, реализующий интерфейс, вы также имеете доступ к методам, не определенным на интерфейсе. Итак, в вашем JarOfSweetsCreator, например, ему нужно будет узнать фактический тип реализации JarOfSweets, а не только интерфейс, чтобы его создать. Это означает, что метод Create можно вызвать другие методы в вашей базовой коллекции, например метод Add.Таким образом, если предположить, что у вас есть 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, он может просто использовать List<T> и делегировать соответствующие функции:

public class JarOfSweets : IJarOfSweets{ 
    public List<ISweet> _list = new List<ISweet>(); 

    public void Shuffle() 
    { 
     throw new NotImplementedException(); 
    } 
    public ISweet TakeSweetFromJar() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Add(Sweet sweet) 
    { 
     _list.Add(sweet); 
    } 

    public int Count 
    { 
     get { return _list.Count; } 
    } 

    public IEnumerator<ISweet> GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 
} 
+0

Благодарим вас за ответ. Его хорошая идея, что я буду использовать, если я не получу другого ответа, хотя, хотя я упомянул только об одном модульном тесте, у меня есть другие тесты, такие как проверка, что сладости - все разные цвета и т. Д. Я не упоминал их, поскольку я думал, что могу дайте им пойти самим после получения помощи в создании коллекции. –

+0

@ LouiseEvans Я добавил альтернативу, которая может быть немного более полезной с вашей реальной реализацией ... Обратите внимание, что создатель может добавить что-то в список, потому что он не обращается к нему через интерфейс readonly, он знает конкретный тип и все доступные функции. – forsvarir

+0

Большое вам спасибо, это очень полезно –