相关疑难解决方法(0)

Moq:非可覆盖成员的设置无效:x => x.GetByTitle("asdf")

不知道如何解决这个问题,尝试对方法"GetByTitle"进行单元测试

以下是我的定义:

public class ArticleDAO :  GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
    public IArticle GetByTitle(string title)
    {
        IQuery query = Session.CreateQuery("...")
        return query.UniqueResult<IArticle>();
    }
}

public interface IArticleDAO
{
    IArticle GetByTitle(string title);
}
Run Code Online (Sandbox Code Playgroud)

单元测试:

[Test]
public void can_load_by_title()
{
    _mockDaoFactory.Setup(x => x.GetArticleDao())
                                .Returns(_mockArticleDao.Object);
    _mockArticleDao.Setup(x => x.GetByTitle("some title"))
                                .Returns(article1.Object);

    _articleManager.LoadArticle("some title");

    Assert.IsNotNull(_articleManager.Article);
}
Run Code Online (Sandbox Code Playgroud)

运行测试给出了错误:

System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Run Code Online (Sandbox Code Playgroud)

更新

[Setup]看起来像:

[Setup]
public void SetUp()
{
     _mockDaoFactory = new Mock<IDaoFactory>();
     _mockArticleDao = new Mock<ArticleDao>();

     _articleManager …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate resharper nunit moq

108
推荐指数
1
解决办法
7万
查看次数

为什么我想要模拟的属性需要是虚拟的?

我正在进行一些单元测试,并使用Moq模拟一些属性.

现在,这是一个Controller测试(ASP.NET MVC 3).我的控制器派生自一个名为AbstractController抽象控制器.

该控制器依赖于Http Context(为了做主题,基于HTTP HOST头的特定于域的逻辑等).

这是通过名为WebSiteSettings的属性完成的:

public abstract class AbstractController : Controller
{
   public WebSiteSettings WebSiteSettings { get; private set; }

   // other code
}
Run Code Online (Sandbox Code Playgroud)

注意私人集 - ctor设置它.所以,我把它改成使用了一个界面,这就是我所嘲笑的:

public IWebSiteSettings WebSiteSettings { get; private set; }
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个"FakeWebSiteSettings",它嘲笑Http Context以便它读取HTTP头.

问题是,当我运行测试时,我得到一个NotSupportedException:

非虚拟(在VB中可覆盖)成员的设置无效:x => x.WebSiteSettings

这是相关的模拟代码:

var mockWebSiteSettings = new Mock<FakeWebSiteSettings>();
var mockController = new Mock<MyController>(SomeRepository);
mockController.Setup(x => x.WebSiteSettings).Returns(mockWebSiteSettings.Object);

_controller = mockController.Object;

var httpContextBase = MvcMockHelpers.FakeHttpContext();
httpContextBase.Setup(x => …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unit-testing controller moq

39
推荐指数
1
解决办法
7万
查看次数

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

使用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
查看次数

System.NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置

我使用Moq在单元测试中收到NotSupportedException错误消息

System.NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置

单元测试代码:

[TestMethod]
public void TestEmailNotSentOut()
{
  // ...

  var dataAccess = new Mock<TjiContext>();       
  var mockSetStock = new Mock<DbSet<Stock>>();
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.Provider).Returns(stockList.Provider);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.Expression).Returns(stockList.Expression);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.ElementType).Returns(stockList.ElementType);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.GetEnumerator()).Returns(stockList.GetEnumerator());
  dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);
Run Code Online (Sandbox Code Playgroud)

这篇文章中的一个建议是将其标记为virtual,但我不确定需要将哪些标记为虚拟?

错误发生在此行:

  dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq

2
推荐指数
1
解决办法
6271
查看次数