所以我试图在 ASP.NET MVC 5 中使用 Autofac Automocking,但由于某种原因我无法让它工作。
这是到目前为止的测试:
using (var mock = AutoMock.GetLoose())
{
const string mainUserID = "MainUserID";
const string otherUserID = "OtherUserID";
ApplicationUser user = new ApplicationUser()
{
Id = mainUserID,
UserName = "TestUser"
};
var dataProvider = mock.Mock<IDataProtectionProvider>();
dataProvider.DefaultValue = DefaultValue.Mock;
var userManagerMock = mock.Mock<ApplicationUserManager>();
}
模拟 ApplicationUserManager 时测试失败。错误是这样的:
Result StackTrace:
at Autofac.Extras.Moq.AutoMock.Mock[T](Parameter[] parameters)
at AwenterWeb_NUnit.AccountControllerTest.<Deactivate_User>d__0.MoveNext() in C:\Users\Fabis\Documents\Docs\Kvalifikācijas darbs 2015\AwenterWeb\AwenterWeb-NUnit\AccountControllerTest.cs:line 51
at NUnit.Framework.AsyncInvocationRegion.AsyncTaskInvocationRegion.WaitForPendingOperationsToComplete(Object invocationResult)
at NUnit.Core.NUnitAsyncTestMethod.RunTestMethod()
Result Message: System.InvalidCastException : Unable to cast object of type 'AwenterWeb.ApplicationUserManager' to type 'Moq.IMocked`1[AwenterWeb.ApplicationUserManager]'.
尝试自动模拟 ApplicationDbContext 时会发生同样的事情,它有一个非常简单的构造函数,所以它甚至不应该有任何问题。我是 Mocking 的新手——在这种情况下我应该怎么做?
编辑:也是一个不相关的问题,也许你们知道 - 我注意到当使用先前在测试中创建的列表为 DbSet 创建 Moq 时,我必须这样做:
var dbSetMock = new Mock<IDbSet<DbEntity>>();
dbSetMock.Setup(m => m.Provider).Returns(data.Provider);
dbSetMock.Setup(m => m.Expression).Returns(data.Expression);
dbSetMock.Setup(m => m.ElementType).Returns(data.ElementType);
dbSetMock.Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
看起来真的很不直观。有没有办法只告诉模拟拿名单?所以像:
dbSetMock.Setup(m => m).Returns(data);
或者以任何其他方式从现有列表中快速创建 DbSet Moq,而无需编写这 4 行额外的行?