Ich versuche, die UnitOfWork jedoch zu verspotten ich brauche etwas Hilfe, da ich nicht meine Ergebnisse leite richtigAutoMapper Mocking UnitOfWork Versagen
Also ich habe folgendes BooksController zu erreichen: -
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>();
}
...................
die folgende 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;
}
...........................
die UnitOfWork: -
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;
}
}
.........................
in Global.asax Ich habe: -
AutoMapperConfig.RegisterMappings();
Die AutoMapperConfig ist wie folgt: -
public static class AutoMapperConfig
{
public static void RegisterMappings()
{
Mapper.Initialize(x =>
{
x.AddProfile<BookMappings>();
});
}
}
und die 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));
}
}
und schließlich den Test I möchte laufen: -
[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);
}
}
Ich möchte die Mock-Liste, die ich in meinem Test erstellt habe, an den BooksController übergeben und überprüfen, dass ich 3 Ergebnisse zurückbekomme, aber das habe ich nicht geschafft.
Im Moment ist es auf der Akte über den Get_Post_Should_Get_All_Books versagt() und es scheint nicht die AutoMapper zu finden und gibt die folgenden Fehler: -
System.NullReferenceException: Objektverweis nicht auf eine Instanz eines gesetzt Objekt.
bei lambda_method (Closure, Buch) bei System.Linq.Enumerable.WhereSelectListIterator 2.MoveNext() at System.Collections.Generic.List
1..ctor (IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 Quelle)
Jede Hilfe wird sehr viel geschätzt. Vielen Dank!
Ich habe hinzugefügt, dass zu der Einrichtung, aber ich bekomme ein Objekt ist nicht auf eine Instanz eines Objekts auf der Act gesetzt - var result = objController.GetBooks(). ToList(); – Johann
@Johann, ich nahm den Code in VS; 'UnitOfWork.BookRepository.GetBooks (" ")' gab mir die erwartete Liste .... so ist das Problem mit Ihrer Automapper-Konfiguration seit; '.ProjectTo();'. vielleicht initialisierst du es nicht .... –
habe ich das in der Jetzt anordnen AutoMapperConfig.RegisterMappings(); aber immer noch den Fehler – Johann