相关疑难解决方法(0)

为什么我收到消息"非虚拟(在VB中可覆盖)成员上的无效设置..."?

我有一个单元测试,我必须模拟一个返回bool类型的非虚方法

public class XmlCupboardAccess
{
    public bool IsDataEntityInXmlCupboard(string dataId,
                                          out string nameInCupboard,
                                          out string refTypeInCupboard,
                                          string nameTemplate = null)
    {
        return IsDataEntityInXmlCupboard(_theDb, dataId, out nameInCupboard, out refTypeInCupboard, nameTemplate);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我有一个XmlCupboardAccess类的模拟对象,我试图在我的测试用例中为这个方法设置mock,如下所示

[TestMethod]
Public void Test()
{
    private string temp1;
    private string temp2;
    private Mock<XmlCupboardAccess> _xmlCupboardAccess = new Mock<XmlCupboardAccess>();
    _xmlCupboardAccess.Setup(x => x.IsDataEntityInXmlCupboard(It.IsAny<string>(), out temp1, out temp2, It.IsAny<string>())).Returns(false); 
    //exception is thrown by this line of code
}
Run Code Online (Sandbox Code Playgroud)

但是这条线引发了异常

Invalid setup on a non-virtual (overridable in VB) member: 
x => x.IsDataEntityInXmlCupboard(It.IsAny<String>(), …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq

163
推荐指数
4
解决办法
13万
查看次数

非虚拟成员的无效设置 - 在接口上?

使用Moq进行单元测试时,出现以下错误:

Message: System.NotSupportedException : 
    Invalid setup on non-virtual (overridable in VB) member: 
    cm => cm.AppSettings[It.IsAny<string>()]
Run Code Online (Sandbox Code Playgroud)

根据这些发现,我理解最好使用Moq的抽象类或接口.

简而言之,我完成了我的作业.=)

但是,如果我实际使用的是接口呢?

ConfigurationServiceTests

[TestFixture]
public class ConfigurationServiceTests {
    [Test]
    public void DialectShouldQueryConfigurationManagerAppSettings() {
        // Given
        configurationManagerMock
            .Setup(cm => cm.AppSettings[It.IsAny<string>()])
            .Returns(It.IsAny<string>());

        // When
        var dialect = configurationService.Dialect;

        // Then
        dialect.Should().BeOfType<string>();
        configurationManagerMock.Verify(cm => cm.AppSettings[It.IsAny<string>()]);
    }

    [SetUp]
    public void ConfigurationServiceSetUp() {
        configurationManagerMock = new Mock<IConfigurationManager>();
        configurationService = 
            new ConfigurationService(configurationManagerMock.Object);
    }

    private Mock<IConfigurationManager> configurationManagerMock;
    private IConfigurationService configurationService;
}
Run Code Online (Sandbox Code Playgroud)

IConfigurationManager

public interface …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing ninject moq

5
推荐指数
1
解决办法
9434
查看次数

标签 统计

c# ×2

moq ×2

unit-testing ×2

ninject ×1