2016-06-05 8 views
2

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!

Antwort

1

Sie haben vergessen, Ihre gefälschte UoW (_unitOfWorkMock) zu konfigurieren, um das Repository zurückzugeben.

Fügen Sie die folgende Zeile in Ihre Methode ordnen oder Setup:

_unitOfWorkMock.Setup(x => x.BookRepository) 
       .Returns(_booksRepositoryMock.Object); 
+0

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

+0

@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 .... –

+0

habe ich das in der Jetzt anordnen AutoMapperConfig.RegisterMappings(); aber immer noch den Fehler – Johann

0

einige Beiträge Nach der Lektüre, die AutoMapper schlagen nicht vor allem mit TDD, entschied ich mich AutoMapper ganz zu entfernen.