In C# wirft Moq VerifySet Expression is not a property setter invocation.
, wenn der Setter nicht trivial ist, auch wenn SetupProperty oder SetupSet verwenden.C# Moq VerifySet-Übergaben Ausdruck ist kein Eigenschaften-Setter-Aufruf für nicht-triviale Setter
Hier ist ein triviales Beispiel. Beachten Sie, dass die Antlers Setter trivial ist und die Antlers2 Setter ist nicht trivial .:
public class Dancer
{
public Dancer(bool pIsMale)
{
IsMale = pIsMale;
}
private bool _IsMale;
public virtual bool IsMale { get { return this._IsMale; } private set { this._IsMale = value; } }
private bool _Antlers;
public virtual bool Antlers
{
get { return this._Antlers; }
set
{
this._Antlers = value;
}
}
public virtual bool Antlers2
{
get { return this._Antlers; }
set
{
// females cannot have antlers
if (IsMale)
this._Antlers = value;
else
this._Antlers = false;
}
}
}
Hier sind die Unit-Tests. Der zweite Satz von drei (mit Antlers2) ist ansonsten identisch mit dem ersten Satz von drei (mit Antlers). Alle Unit Tests mit Antlers bestehen den Test. Alle Komponententests, die Antlers2 verwenden, werfen Expression is not a property setter invocation.
, selbst wenn SetupProperty wo ich dachte, die gesamte Implementierung der Eigenschaft wird vollständig ignoriert und durch Moq ersetzt.
public class DancerTests
{
[Fact]
public void Antlers_NoSetup()
{
// Arrange
// create mock of class under test
var sut = new Mock<Dancer>(true) { CallBase = true };
// Act
sut.Object.Antlers = true;
// Assert
sut.VerifySet(x => x.Antlers = true);
}
[Fact]
public void Antlers_SetupProperty()
{
// Arrange
// create mock of class under test
var sut = new Mock<Dancer>(true) { CallBase = true };
sut.SetupProperty(x => x.Antlers, false);
// Act
sut.Object.Antlers = true;
// Assert
sut.VerifySet(x => x.Antlers = true);
}
[Fact]
public void Antlers_SetupSet()
{
// Arrange
// create mock of class under test
var sut = new Mock<Dancer>(true) { CallBase = true };
sut.SetupSet(x => x.Antlers = true);
// Act
sut.Object.Antlers = true;
// Assert
sut.VerifySet(x => x.Antlers = true);
}
[Fact]
public void Antlers2_NoSetup()
{
// Arrange
// create mock of class under test
var sut = new Mock<Dancer>(true) { CallBase = true };
// Act
sut.Object.Antlers2 = true;
// Assert
sut.VerifySet(x => x.Antlers2 = true);
}
[Fact]
public void Antlers2_SetupProperty()
{
// Arrange
// create mock of class under test
var sut = new Mock<Dancer>(true) { CallBase = true };
sut.SetupProperty(x => x.Antlers2, false);
// Act
sut.Object.Antlers2 = true;
// Assert
sut.VerifySet(x => x.Antlers2 = true);
}
[Fact]
public void Antlers2_SetupSet()
{
// Arrange
// create mock of class under test
var sut = new Mock<Dancer>(true) { CallBase = true };
sut.SetupSet(x => x.Antlers2 = true);
// Act
sut.Object.Antlers2 = true;
// Assert
sut.VerifySet(x => x.Antlers2 = true);
}
}
Was ist es mit nicht-trivialen Basisklasseneigenschaften, die Moqs VerifySet verwechseln? Ich verwende Moq 4.7.99, Visual Studio 2015, Targeting .Net Framework 4.5.2.
Danke für die Hilfe! Ich habe stark von StackOverflow profitiert!
Danke. Tolle Erklärung! Ich habe dies tatsächlich als Bug zu GitHub/Moq gepostet. Siehe [hier] (https://github.com/moq/moq4/issues/430). –
Etwas Neues ist mir aufgefallen. Die Ausführung von VerifySet verursacht die Ausführung des Eigenschaftensetzers. Selbst wenn die Eigenschaft mit einer SetupProperty verspottet wurde, führt das VerifySet die Implementierung des aktuellen Property Setters erneut aus. ** Warum führt VerifySet den Property Setter überhaupt aus? ** Soll nicht einfach gemeldet werden, ob der Property Setter bereits von der Testausführung ausgeführt wurde? Ich glaube, dass die erneute Ausführung des tatsächlichen Eigentums-Setters die Ursache des Fehlers ist, obwohl ich immer noch glaube, dass Sie bezüglich der "letzten Aufruf-Methode" oben genau an einem anderen Ort korrekt sind. –