Ho avuto un problema strano mentre usavo NSubstitute un paio di volte e sebbene so come aggirare non sono mai riuscito a spiegarlo.Restituire il risultato di un metodo che restituisce un altro sostituto genera un'eccezione in NSubstitute
Ho creato quello che sembra essere il test minimo richiesto per dimostrare il problema e sembra che abbia a che fare con l'utilizzo di un metodo per creare un valore di ritorno sostituito.
public interface IMyObject
{
int Value { get; }
}
public interface IMyInterface
{
IMyObject MyProperty { get; }
}
[TestMethod]
public void NSubstitute_ReturnsFromMethod_Test()
{
var sub = Substitute.For<IMyInterface>();
sub.MyProperty.Returns(MyMethod());
}
private IMyObject MyMethod()
{
var ob = Substitute.For<IMyObject>();
ob.Value.Returns(1);
return ob;
}
Quando eseguo la prova di cui sopra ottengo la seguente eccezione:
Test method globalroam.Model.NEM.Test.ViewModel.DelayedAction_Test.NSubstitute_ReturnsFromMethod_Test threw exception:
NSubstitute.Exceptions.CouldNotSetReturnException: Could not find a call to return from.
Make sure you called Returns() after calling your substitute (for example: mySub.SomeMethod().Returns(value)).
If you substituted for a class rather than an interface, check that the call to your substitute was on a virtual/abstract member.
Return values cannot be configured for non-virtual/non-abstract members.
Tuttavia, se cambio il metodo di prova per restituire questo:
sub.MyProperty.Returns((a) => MyMethod());
o questo:
var result = MyMethod();
sub.MyProperty.Returns(result);
Funziona .
Mi chiedo solo se qualcuno può spiegare perché questo accade?
Grazie per la risposta dettagliata. È molto più complicato di quanto mi aspettassi. Pensi che questo sia considerato un bug in NHibernate? Raccolgo dalla tua risposta che si tratta di un problema noto e piuttosto complesso da risolvere. – craftworkgames
È una limitazione della scelta della sintassi. La modifica di NSub per l'utilizzo di SubstituteFactories locali potrebbe aiutare (potremmo mantenere un sacco di stati in giro per test e ricerche, piuttosto che stato globale), ma non sicuro se le persone sarebbero disposte a complicare la sintassi per la creazione di sottotitoli. Penso che lo preferirei, ma non sono sicuro che sia un problema abbastanza grande da giustificare il cambiamento a questo punto. –
Il vero problema è che il codice sembrava corretto da ogni angolazione, quindi era difficile diagnosticare il problema. Forse potrebbero essere utili messaggi di errore migliori, ma non ho idea di cosa potrebbero essere. Grazie ancora. – craftworkgames