gpt4 book ai didi

c# - 最小起订量 : Property is correctly set as virtual but still have invalid setup on a non-virtual member

转载 作者:行者123 更新时间:2023-11-30 12:56:33 27 4
gpt4 key购买 nike

我想对继承自 IdentityDbContext 的 DbContext 进行单元测试

我收到一条 NotSupportedException 错误消息,其中包含非常常见的消息:

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member

为了找到一些线索,我已经阅读了很多帖子。以下是一些示例:

显然,解决方案似乎是将 dbSet 设置为虚拟的。我做了什么。

运气不好,错误依旧。

这是我的IdentityDataContext:

public class IdentityDataContext : IdentityDbContext<ApplicationUser>
{
public virtual DbSet<Search> Searches { get; set; }

public IdentityDataContext()
: base("LocalDb",
throwIfV1Schema: true)
{
}

public static IdentityDataContext Create()
{
return new IdentityDataContext();
}
}

这是我的搜索 POCO:

public class Search : BaseEntity
{
//BaseEntity is just an abstract class with createdAt,Id,updatedAt property
public string ConsumerIdentifier { get; set; }
public string LanguageCode { get; set; }
}

最后是我的设置方法:

[TestInitialize]
public void SetupTest()
{
//DataInitializer.GetAllSearches() returns a List of "Search"

_searches = DataInitializer.GetAllSearches();

var dbSet = new Mock<DbSet<Search>>();
dbSet.As<IQueryable<Search>>().Setup(m => m.Provider).Returns(_searches.AsQueryable().Provider);
dbSet.As<IQueryable<Search>>().Setup(m => m.Expression).Returns(_searches.AsQueryable().Expression);
dbSet.As<IQueryable<Search>>().Setup(m => m.ElementType).Returns(_searches.AsQueryable().ElementType);
dbSet.As<IQueryable<Search>>().Setup(m => m.GetEnumerator()).Returns(_searches.AsQueryable().GetEnumerator());
dbSet.Setup(d => d.Add(It.IsAny<Search>())).Callback<Search>(_searches.Add);

_dataContextMock = new Mock<IdentityDataContext>()
{
CallBase = true
};

// The error appears here ---------------- _
dataContextMock.Setup(x => x.Searches).Returns(dbSet.Object);
//----------------------------------------------------------------------

_dataContextMock.Setup(x => x.Set<Search>()).Returns(dbSet.Object);

_searchRepository = new SearchRepository(_dataContextMock.Object);
}

我错过了什么?

最佳答案

1) 无需对 DbContext 进行单元测试。微软早就对其进行了广泛的测试。

2) 如果要将 DbContext 用作另一个类的依赖项,则抽象 dbcontext

public interface IDataContext {
DbSet<Search> Searches { get; set; }
}

public class IdentityDataContext : IdentityDbContext<ApplicationUser>, IDataContext { ... }

public class SearchRepository {
public SearchRepository(IDataContext context) { ... }
}

不要让你的类(class)依赖于具体化,而是依赖于抽象。 IdentityDataContext 是依赖类不需要知道的实现细节。

这将允许更灵活的测试

Mock<IDataContext> _dataContextMock;

[TestInitialize]
public void SetupTest() {

//DataInitializer.GetAllSearches() returns a List of "Search"
_searches = DataInitializer.GetAllSearches();
var queryable = _searches.AsQueryable();

var dbSet = new Mock<DbSet<Search>>();
dbSet.As<IQueryable<Search>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<Search>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<Search>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<Search>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
dbSet.Setup(d => d.Add(It.IsAny<Search>())).Callback<Search>(_searches.Add);


_dataContextMock = new Mock<IDataContext>();

_dataContextMock.Setup(x => x.Searches).Returns(dbSet.Object);

_dataContextMock.Setup(x => x.Set<Search>()).Returns(dbSet.Object);

_searchRepository = new SearchRepository(_dataContextMock.Object);

}

关于c# - 最小起订量 : Property is correctly set as virtual but still have invalid setup on a non-virtual member,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com