2013-09-21 7 views
0

Я получаю какое-то странное поведение в тесте, который я пишу, используя FluentAssertions. У меня есть следующий класс:FluentAssertions Должен содержать неудачу, когда он не должен

public class Die 
{ 
    Random rand; 

    public Die() 
    { 
     rand = new Random(); 
    } 

    public Symbol Roll() 
    { 
     var symbols = Enum.GetValues(typeof(Symbol)); 
     return (Symbol)symbols.GetValue(rand.Next(symbols.Length)); 
    } 
} 

public enum Symbol 
{ 
    Success, 
    Failure 
} 

Я хочу сделать некоторые быстрые здравомыслие проверки, что я на самом деле создает кубик, который возвращает случайное значение, и не всегда то же самое значение. Таким образом, мой «быстрый и грязный» для TDD должен был опрокинуть его 100 раз и предположить, что он как минимум генерирует оба значения один раз. Тем не менее, я заметил, что когда я снизил число ниже (до 10), я получал некоторые неудачи, которых я не ожидал. Удаление его до 2 выглядело так:

[TestMethod] 
public void Test_Die_Roll_Returns_Multiple_Values() 
{ 
    Die die = new Die(); 

    Enumerable.Range(1, 2) 
    .Select((x) => die.Roll()).Should().Contain(Symbol.Success); 
} 

Иногда, когда я запускаю этот тест, он проходит. Иногда это терпит неудачу, конечно, когда коллекция {Failure, Failure}. Это ожидается. Однако иногда это происходит с сообщением вроде этого:

Сообщение: Ожидаемый набор {Успех, Сбой}, чтобы содержать Успех.

Что здесь происходит? Я сделал кое-что, и нашел много вещей о Содержаниях, используя ссылочные равны вместо значения равным. Желая двигаться дальше, я попытался это:

[TestMethod] 
public void Test_Die_Roll_Returns_Multiple_Values() 
{ 
    Die die = new Die(); 

    Enumerable.Range(1, 2) 
    .Select((x) => die.Roll()).Should().Contain(s => s.ToString().Equals("Success")); 
} 

Только иногда получить пропуск, и иногда получают:

сообщение: Коллекция {Успех, отказ} должен иметь элемент соответствия s.ToString() .equals ("Успех").

Что происходит?

+1

Вы пытались добавить ToArray() за Select()? Потому что теперь вы передаете дерево выражений в Should(). –

+0

Нет, я этого не делал, и похоже, что он работает так, как я ожидал. Я действительно не понимаю, почему то, что я делал, раньше работало. – jtheis

ответ

1

Поскольку вы используете метод Roll(), возвращающий случайные числа, вы уже довольно хрупкий. Это может быть просто результатом этой случайности. Передача дерева выражений в метод, который принимает IEnumerable, является плохой практикой и источником многих ошибок. Всегда сначала вызывайте ToList() или ToArray() (хотя первый бит быстрее).

+0

Я не думаю, что случайные значения являются проблемой. Это определенно похоже на то, что вы ударили ноготь по голове, передав дерево выражений в IEnumerable. Знаете ли вы какие-либо хорошие статьи или читаете, почему это плохо, что происходит под обложками и т. Д., Поэтому я могу узнать больше? Спасибо за вашу помощь! – jtheis

+1

Это одна из самых распространенных проблем http://weblogs.asp.net/okloeten/archive/2008/05/27/6225197.aspx –

+0

Прохладный. Это дает мне отправную точку. Большое спасибо. – jtheis

Смежные вопросы