Nsubstitute,改变被代入的属性的值
Nsubstitute, changing the value of a property which is substituted
我想将模型中的 属性 模拟为特定值(因为它有一个私有的 setter)。
然后我会调用一个方法来改变这个 属性 然后检查结果。问题是 属性 总是 return 这个值。我能以某种方式解决这个问题吗?
示例如下:
public class Tests
{
[Fact]
public void Test1()
{
//Arrange
var document = Substitute.For<Document>();
document.State.Returns(DocumentState.Confirmed);
//Act
document.Close();
//Assert
Assert.Equal(DocumentState.Closed, document.State); // FAIL, State still equals "DocumentState.Confirmed"
}
}
public class Document
{
public virtual DocumentState State { get; private set; }
public void Close()
{
if (State != DocumentState.Confirmed)
throw new InvalidOperationException();
State = DocumentState.Closed;
}
}
public enum DocumentState
{
Draft,
Confirmed,
Closed
}
模拟您正在测试的 class 是一个 真的 坏主意。它会导致各种奇怪的问题,更不用说紧密耦合的测试了。如果您真的想要测试这个场景,那么您可以手动滚动一个可测试的存根:
public class TestableDocument : Document {
DocumentState _state;
bool first = true;
public TestableDocument(DocumentState state) {
_state = state;
}
public override DocumentState State {
get {
if (first) {
first = false;
return _state;
}
return base.State;
}
}
}
然后您将在测试中实例化它,而不是文档。
[Fact]
public void Test1()
{
//Arrange
var document = new TestableDocument(DocumentState.Confirmed));
//Act
document.Close();
//Assert
Assert.Equal(DocumentState.Closed, document.State);
}
可能有一种方法可以用 NSubstitute 做类似的事情,但我不知道它是什么。
不过一般来说,如果您在嘲笑您正在测试的 class,那么您很有可能正在测试错误的东西,或者您应该考虑重构您的代码...
我想将模型中的 属性 模拟为特定值(因为它有一个私有的 setter)。 然后我会调用一个方法来改变这个 属性 然后检查结果。问题是 属性 总是 return 这个值。我能以某种方式解决这个问题吗?
示例如下:
public class Tests
{
[Fact]
public void Test1()
{
//Arrange
var document = Substitute.For<Document>();
document.State.Returns(DocumentState.Confirmed);
//Act
document.Close();
//Assert
Assert.Equal(DocumentState.Closed, document.State); // FAIL, State still equals "DocumentState.Confirmed"
}
}
public class Document
{
public virtual DocumentState State { get; private set; }
public void Close()
{
if (State != DocumentState.Confirmed)
throw new InvalidOperationException();
State = DocumentState.Closed;
}
}
public enum DocumentState
{
Draft,
Confirmed,
Closed
}
模拟您正在测试的 class 是一个 真的 坏主意。它会导致各种奇怪的问题,更不用说紧密耦合的测试了。如果您真的想要测试这个场景,那么您可以手动滚动一个可测试的存根:
public class TestableDocument : Document {
DocumentState _state;
bool first = true;
public TestableDocument(DocumentState state) {
_state = state;
}
public override DocumentState State {
get {
if (first) {
first = false;
return _state;
}
return base.State;
}
}
}
然后您将在测试中实例化它,而不是文档。
[Fact]
public void Test1()
{
//Arrange
var document = new TestableDocument(DocumentState.Confirmed));
//Act
document.Close();
//Assert
Assert.Equal(DocumentState.Closed, document.State);
}
可能有一种方法可以用 NSubstitute 做类似的事情,但我不知道它是什么。
不过一般来说,如果您在嘲笑您正在测试的 class,那么您很有可能正在测试错误的东西,或者您应该考虑重构您的代码...