2015-11-20 2 views
0

Я только начал использовать NSubstitute. Я в основном работал с Moq, и это то, что я делал:NSubstitute не распечатывает утверждение NUnit

// In my unit test on menter code herey mock: 
HasLogMessage(Is.EqualTo("expected value")); 

private void HasLogMessage(EqualConstraint s) 
{ 
    log.Verify(y => y.Error(It.Is<string>(v => Verify(v, s)))); 
} 

private bool Verify(string s, EqualConstraint equalConstraint) 
{ 
    Assert.That(s, equalConstraint); 
    return true; 
} 

выход, когда модульное тестирование выполняется. Обратите внимание, что он говорит, что ожидается и реальное значение:

Expected string length 14 but was 116. Strings differ at index 0. 
Expected: "expected value" 
But was: "real value..." 
-----------^ 
at NUnit.Framework.Assert.That(Object actual, 

IResolveConstraint выражение, String сообщение, Object [] арг)

Я хочу, чтобы иметь возможность использовать его с NSubstitute издевается, и вот моя попытка это:

HasLogMessage(Is.EqualTo("Expected value")); 

private void HasLogMessage(EqualConstraint s) 
{ 
    log.Received().Log(LogLevel.Error, Arg.Is<Func<string>>(x => Verify(x, 
} 

private bool Verify(Func<string> s, EqualConstraint equalConstraint) 
{ 
    Assert.That(s(), equalConstraint); 
    return true; 
} 

Но это не выводит ошибка NUnit утверждения

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching: 
    Log(Error, x => value(IdentityServer3.Saml2Bearer.Tests.Saml2BearerGrantValidatorTest) 
.Verify(x, value(IdentityServer3.Saml2Bearer.Tests.Saml2BearerGrantValidatorTest+<>c__DisplayClass21_0).s), <null>,) 
Actually received no matching calls. 
Received 2 non-matching calls (non-matching arguments indicated 
with '*' characters) 

Я что-то пропустил?

ответ

0

Update после типа Log осветления:

Другие, чем при использовании incomplete plumbing mentioned below, для Func<string> я бы захватить аргументы, используемые и проверять их позже.

var log = Substitute.For<ILog>(); 
var loggedErrors = new List<string>(); 
// Capture the argument passed to Log whenever LogLevel.Error is called 
log.Log (LogLevel.Error, Arg.Do<Func<string>>(x => loggedErrors.Add(x()))); 

log.Log(LogLevel.Error,() => "the real call..."); 

Assert.That(loggedErrors, Is.EqualTo (new[] { "expected" })); 

/* 
NUnit.Framework.AssertionException: Expected is <System.String[1]>, actual is <System.Collections.Generic.List`1[System.String]> with 1 elements 
    Values differ at index [0] 
    Expected string length 8 but was 16. Strings differ at index 0. 
    Expected: "expected" 
    But was: "the real call..." 
    -----------^ 
*/ 

Оригинальный ответ:

Мы бы нормально написать это как простой Received() утверждение, которое покажет как ожидаемые и фактические значения.

log.Received().Log (LogLevel.Error, "expected"); 

/* 
Expected to receive a call matching: 
    Log(Error, "expected") 
Actually received no matching calls. 
Received 1 non-matching call (non-matching arguments indicated with '*' characters): 
    Log(Error, *"the real call..."*) 
*/ 

Если вы хотите использовать библиотеку утверждения для более описательных спичек есть некоторая неполная сантехника в NSubstitute, чтобы это с небольшим количеством работы. Существует an example in this issue.

+0

Ваш пример не подходит здесь, второй параметр не является строкой, это 'Func '. И я думаю, это не сработало бы, потому что NSubstitute не будет оценивать мою вторую, он просто сказал бы, что получил неинтерактивный вызов, где второй параметр был другой функцией. 'log.Received() .Log (LogLevel.Error,() =>" expected ");' – Darius

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