FluentAssertion не может сравнить перечисляемые строки - PullRequest
2 голосов
/ 02 февраля 2012

Этот код работает нормально

    [Test]
    public void boo()
    {
        var collection = new[] { 1, 2, 3 };
        collection.Should().Equal(1, 2, 3);
    }

Но это не удается

    [Test]
    public void foo()
    {
        var collection = new[] { "1", "2", "3" };
        collection.Should().Equal("1", "2", "3");            
    }

Сообщение об ошибке:

'Ожидаемый сбор будет равен{1} потому что 2, но {"1", "2", "3"} содержит 2 элементов слишком много. '

Что здесь не так?Почему перечислимая строка не может быть сравнена?

И, конечно, мой вопрос - как обращаться с регистром в foo ()?

Ответы [ 4 ]

5 голосов
/ 02 февраля 2012

Проблема заключается в том, что второй вызов разрешается со следующей перегрузкой:

public AndConstraint<TAssertions> Equal(IEnumerable expected, 
                                        string reason, 
                                        params object[] reasonArgs); 

Вместо:

public AndConstraint<TAssertions> Equal(params object[] elements);

Чтобы получить желаемый результат, вы можете принудительно заставить компилятор выполнить командуправильный метод перегрузки, например, с помощью:

collection.Should().Equal((object)"1", "2", "3");
3 голосов
/ 02 февраля 2012

Это происходит потому, что компилятор выбирает неправильную перегрузку Equals () из-за ограничений в C #. В вашем конкретном случае вместо Equals (IEnumerable) используются Equals (ожидаемая строка, причина строки, params string [] args). Я никогда не находил простой способ решить эту двусмысленность в FluentAssertions.

Чтобы решить вашу проблему, оберните ожидаемые значения в массив.

[Test] 
public void foo()  
{ 
  var collection = new[] { "1", "2", "3" }; 
  collection.Should().Equal(new[] {"1", "2", "3"});              
}
0 голосов
/ 02 февраля 2012

Попробуйте вместо SequenceEquals?

http://msdn.microsoft.com/en-us/library/bb342073.aspx

И метод Equals просто сравнивает ссылки на равенство.

Вот строка из модульного теста в одном измои проекты:

Assert.IsTrue(expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)));

Все элементы в "ожидаемом" и "фактическом" реализуют IEQuatable.

0 голосов
/ 02 февраля 2012

Что происходит с тестом:

[Test]
public void foo()
{
    const string one = "1";
    const string two = "2";
    const string three = "3";
    var collection = new[] { one, two, three };
    collection.Should().Equal(one, two, three);            
}

Я предполагаю, как Кенни признал в комментарии, что вы делаете равенство ссылок, когда эти строки не совпадают.

...