不知道如何解决这个问题,尝试对方法"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) 我正在进行一些单元测试,并使用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) 使用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) 我使用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# ×4
moq ×4
unit-testing ×3
asp.net-mvc ×1
controller ×1
nhibernate ×1
ninject ×1
nunit ×1
resharper ×1