我已经阅读了很多关于这个主题的其他QA,我仍然无法找到问题的解决方案,所以我决定公开我的案例.
我有这个界面
public interface IRepository<T> where T : class, IEntity
{
IQueryable<T> Find(Expression<Func<T, bool>> predicate);
T FindIncluding(int id, params Expression<Func<T, object>>[] includeProperties);
}
Run Code Online (Sandbox Code Playgroud)
这是包含我想要设置的Mock的方法的基本结构
public PeopleController CreatePeopleController()
{
var mockUnitofWork = new Mock<IUnitOfWork>();
var mockPeopleRepository = new Mock<IRepository<Person>>();
mockPeopleRepository.Setup(r=>r.Find().Returns(new Person(){});
mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object);
return new PeopleController(mockUnitofWork.Object);
}
Run Code Online (Sandbox Code Playgroud)
我一直试图用这种方式设置模拟:
public PeopleController CreatePeopleController()
{
var mockUnitofWork = new Mock<IUnitOfWork>();
var mockPeopleRepository = new Mock<IRepository<Person>>();
mockPeopleRepository.Setup(r=>r.Find(It.isAny<Expression<Func<Person,bool>>>()).Single()).Returns(new Person(){});
mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object);
return new PeopleController(mockUnitofWork.Object);
}
Run Code Online (Sandbox Code Playgroud)
但系统总是抛出相同的异常"System.NotSupportedException:Expression引用一个不属于模拟对象的方法......"
另外我想补充说我正在使用MSTest和Moq
我知道使用Expression设置模拟并不容易,不推荐,但这对我来说非常重要因为"查找"是我在我的应用程序中大量使用的方法
我有这个方法,我在我的控制器中调用,必须删除一个特定的文档.我在一些文章中读到删除文档的最佳方法是使用IndexWriter.但我不能让它发挥作用.这是我的代码
我的索引:
var article1 = new Document();
article1.Add(new Field("Id", "1", Field.Store.YES, Field.Index.ANALYZED));
article1.Add(new Field("Author", "Author", Field.Store.YES, Field.Index.ANALYZED));
article1.Add(new Field("Title", "Title", Field.Store.YES, Field.Index.ANALYZED));
var directory = FSDirectory.Open(new DirectoryInfo(IndexRoute));
var analyzar = new StandardAnalyzer(Version.LUCENE_29);
var writer = new IndexWriter(directory, analyzar, true, IndexWriter.MaxFieldLength.LIMITED);
writer.AddDocument(article1);
writer.Optimize();
writer.Commit();
writer.Close();
Run Code Online (Sandbox Code Playgroud)
方法删除:
public void Delete(string id)
{
var directory = FSDirectory.Open(new DirectoryInfo(IndexRoute));
var analyzar = new StandardAnalyzer(Version.LUCENE_29);
var writer = new IndexWriter(directory, analyzar, true, IndexWriter.MaxFieldLength.LIMITED);
var term = new Term("Id", id);
writer.DeleteDocuments(term);
writer.Optimize();
writer.Commit();
writer.Close();
}
Run Code Online (Sandbox Code Playgroud)
控制器中调用"删除"void的方法: …