c# - Nsubstitute,改变被替代的属性的值

标签 c# unit-testing mocking xunit nsubstitute

我想将模型中的属性模拟为特定值(因为它有一个私有(private) setter )。 然后我会调用一个方法来改变这个属性然后检查结果。问题是该属性将始终返回此值。我能以某种方式解决这个问题吗?

例子如下:

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
}

最佳答案

模拟您正在测试的类是一个真的坏主意。它会导致各种奇怪的问题,更不用说紧密耦合的测试了。如果您真的想要测试这个场景,那么您可以手动滚动一个可测试的 stub :

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 做类似的事情,但我不知道它是什么。

不过一般来说,如果您正在模拟您正在测试的类,那么您很有可能正在测试错误的东西,或者您应该考虑重构您的代码...

关于c# - Nsubstitute,改变被替代的属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30933388/

相关文章:

c# - Tridion : How can I find out if a page has been published to a particular publication target using the business connector?

c# - 在存储过程中添加一条到多条记录

unit-testing - 使用 typescript、karma 和 jasmine 对 RxJS Observable.timer 进行单元测试

c# - 模拟流以读取字节[]

c++ - 如何使用签名 `object ()` 模拟函数

c# - 如何解析 Windows 应用商店应用程序中的 HTML?

node.js - 使用 context.succeed() 的 Node 单元测试 AWS Lambda 函数

unit-testing - 检查 IBOutlet 与 OCMock 的连接

python - 如何模拟一个csv文件

c# - 从 IEnumerable<ObservableCollection<T>> C# 中提取项目