【发布时间】:2016-06-05 11:09:28
【问题描述】:
我正在尝试模拟 UnitOfWork,但我需要一些帮助,因为我无法正确实现我的结果
所以我有以下 BooksController:-
public class BooksController : BaseController
{
private IUnitOfWork UnitOfWork;
public BooksController()
{
UnitOfWork = new UnitOfWork();
}
public BooksController(IUnitOfWork unitOfWork)
{
UnitOfWork = unitOfWork;
}
// GET: api/Books
public IQueryable<BookDTO> GetBooks()
{
return UnitOfWork.BookRepository.GetBooks("").ProjectTo<BookDTO>();
}
...................
以下 BooksRepository:-
public class BooksRepository : IBooksRepository
{
internal BookContext Context = new BookContext();
internal DbSet<Book> dbSet;
public BooksRepository(BookContext context)
{
Context = context;
dbSet = context.Set<Book>();
}
public virtual IQueryable<Book> GetBooks(string includeProperties = "")
{
IQueryable<Book> query = dbSet;
foreach (var includeProperty in includeProperties.Split
(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
return query;
}
...........................
工作单元:-
public class UnitOfWork : IDisposable, IUnitOfWork
{
private readonly BookContext _context = new BookContext();
private IBooksRepository _booksRepository;
public IBooksRepository BookRepository
{
get
{
if (_booksRepository == null)
{
_booksRepository = new BooksRepository(_context);
}
return _booksRepository;
}
}
.........................
在 Global.asax 我有:-
AutoMapperConfig.RegisterMappings();
AutoMapperConfig 如下:-
public static class AutoMapperConfig
{
public static void RegisterMappings()
{
Mapper.Initialize(x =>
{
x.AddProfile<BookMappings>();
});
}
}
还有 BookMappings :-
public class BookMappings : Profile
{
public override string ProfileName => "BookMappings";
protected override void Configure()
{
CreateMap<Book, BookDTO>();
CreateMap<Book, BookDTO>()
.ForMember(dest => dest.BookTitle,
opts => opts.MapFrom(src => src.Title));
CreateMap<Book, BookDTO>()
.ForMember(dest => dest.AuthorName,
opts => opts.MapFrom(src => src.Author.Name));
CreateMap<Book, BookDetailDTO>();
CreateMap<Book, BookDetailDTO>()
.ForMember(dest => dest.BookTitle,
opts => opts.MapFrom(src => src.Title));
CreateMap<Book, BookDetailDTO>()
.ForMember(dest => dest.AuthorName,
opts => opts.MapFrom(src => src.Author.Name));
CreateMap<Book, BookDetailDTO>()
.ForMember(dest => dest.GenreType,
opts => opts.MapFrom(src => src.Genre.Type));
}
}
最后是我希望运行的测试:-
[TestFixture]
public class BooksControllerTests
{
private Mock<IUnitOfWork> _unitOfWorkMock;
private Mock<IBooksRepository> _booksRepositoryMock;
BooksController objController;
List<Book> books = new List<Book>();
[SetUp]
public void Setup()
{
_unitOfWorkMock = new Mock<IUnitOfWork>();
_booksRepositoryMock = new Mock<IBooksRepository>();
_unitOfWorkMock.Setup(x => x.BookRepository)
.Returns(_booksRepositoryMock.Object);
objController = new BooksController(_unitOfWorkMock.Object);
AutoMapperConfig.RegisterMappings();
books = new List<Book>()
{
new Book {Id = 1, Title = "Hamlet", ISBN = 1853260096, AuthorId = 1, GenreId = 1, IsAvailable = true, Summary = "Hamlet is not only one of Shakespeare's greatest plays, but also the most fascinatingly problematical tragedy. "},
new Book {Id = 2, Title = "Macbeth", ISBN = 1853260355, AuthorId = 1, GenreId = 1, IsAvailable = true, Summary = "Shakespeare’s Macbeth is one of the greatest tragic dramas the world has known. "},
new Book {Id = 3, Title = "Romeo And Juliet", ISBN = 1840224339, AuthorId = 1, GenreId = 2, IsAvailable = true, Summary = "Romeo and Juliet is the world's most famous drama of tragic young love. "}
};
}
[Test]
public void Get_Post_Should_Get_All_Books()
{
// Arrange
_booksRepositoryMock.Setup(x => x.GetBooks(""))
.Returns(books.AsQueryable());
// Act
var result = objController.GetBooks().ToList();
// Assert
Assert.AreEqual(result.Count, 3);
}
}
我希望将我在测试中创建的模拟列表传递给 BooksController 并验证我得到了 3 个结果,但是我没有设法做到这一点。
目前它在 Get_Post_Should_Get_All_Books() 的行为上失败了 它似乎没有找到 Automapper 并给出以下错误:-
System.NullReferenceException : 对象引用未设置为对象的实例。
在 lambda_method(Closure , Book )
在 System.Linq.Enumerable.WhereSelectListIterator2.MoveNext()
at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源)
任何帮助将不胜感激。谢谢!
【问题讨论】:
标签: c# unit-testing mocking tdd moq