そのため、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 を自動モックしようとすると同じことが起こり、非常に単純なコンストラクターがあるため、問題は発生しません。モッキングは初めてです - このシナリオではどうすればよいですか?
編集:また、無関係な質問ですが、ご存知かもしれませんが、テストで以前に作成したリストを使用して 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);
または、これらの 4 行を追加せずに既存のリストから DbSet Moq をすばやく作成する他の方法はありますか?