模拟工作单元和单元测试的存储库

时间:2017-03-07 11:52:31

标签: c# unit-testing moq repository-pattern unit-of-work

试图抓住工作单元和存储库模式,并构建了下面的代码,我现在正试图在一个单独的组件中测试它。

public class MemberRepository : Repository<Member>, IMemberRepository
{
    public MemberRepository(LibraryContext context) : base(context) { }

    public Member CheckMemberExist(string ssn)
    {
        return LibraryContext.Members.FirstOrDefault(m => m.SSN == ssn);
    }

    public IEnumerable<Member> FindByMemberCard(string cardnumber)
    {
        return LibraryContext
            .Members
            .Where(m => m.ID == LibraryContext.MemberCards.FirstOrDefault(mc => mc.CardID == cardnumber).MemberID);
    }

    public bool MembershipExpired(string ssn)
    {
        return LibraryContext.MemberCards.FirstOrDefault(mc => mc.MemberID == LibraryContext.Members.FirstOrDefault(m => m.SSN == ssn).ID).Expires < DateTime.Now ? true : false;
    }

    public void RenewMembershipCard(string ssn)
    {
        var membercard = LibraryContext.MemberCards.FirstOrDefault(mc => mc.MemberID == LibraryContext.Members.FirstOrDefault(m => m.SSN == ssn).ID);
        if (membercard != null)
        {
            membercard.Expires = membercard.Expires.AddYears(1);
            LibraryContext.SaveChanges();
        }
    }


    public LibraryContext LibraryContext
    {
        get { return Context as LibraryContext; }
    }
}

我的上下文文件:

public partial class LibraryContext : DbContext
{
    public LibraryContext()
        : base("name=LibraryContext")
    {
        Configuration.LazyLoadingEnabled = true;
    }

    public DbSet<LentType> BookLentTypes { get; set; }
    public DbSet<BookBrokenNotReplaced> BookBrokenNotReplaced { get; set; }
    public DbSet<BookVolume> BookVolume { get; set; }
    public DbSet<Item> Books { get; set; }
    public DbSet<Member> Members { get; set; }
    public DbSet<MemberCard> MemberCards { get; set; }
    public DbSet<MemberType> MemberType { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Material>().ToTable("Materials");
        modelBuilder.Entity<Book>().ToTable("Books");
    }
}

IRepository类:

public interface IRepository<TEntity> where TEntity : class
{
    TEntity Get(int id);
    IEnumerable<TEntity> GetAll();
    IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate);

    void Add(TEntity entity);
    void AddRange(IEnumerable<TEntity> entities);

    void Remove(TEntity entity);
    void RemoveRange(IEnumerable<TEntity> entities);
}

我的MemberRepository类:

public interface IMemberRepository : IRepository<Member>
{
    bool MembershipExpired(string ssn);

    void RenewMembershipCard(string ssn);

    IEnumerable<Member> FindByMemberCard(string cardnumber);

    Member CheckMemberExist(string ssn);

}

对于上面的代码,我创建了一个工作单元类,如下所示:

public class UnitOfWork : IUnitOfWork
{
    private readonly LibraryContext _context;

    public UnitOfWork(LibraryContext context)
    {
        _context = context;
        Members = new MemberRepository(_context);
    }
    public IMemberRepository Members { get; private set; }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

UoW的界面:

public interface IUnitOfWork : IDisposable
{
    IMemberRepository Members { get; }

    int Complete();
}

我现在想使用Moq模拟存储库并在不与数据库联系的情况下对隔离单元执行测试,但我需要一些示例来开始。

我试图通过运行以下设置和单元测试来查看是否存在成员:

     private IList<Member> _memberList;
     private IList<MemberCard> _memberCardList;

    [TestInitialize]
    public void Initialize()
    {
        //Member List
        _memberList = new List<Member>();
        _memberList.Add(new Member()
        {
            ID = 1,
            Email = "test@test.com",
            HomeAddress = "test",
            Phone = "123123123",
            SSN = "12345678910",
            MemberType = new MemberType()
            {
                MemberTypeName = "Student"
            }
        });
        _memberList.Add(new Member()
        {
            ID = 2,
            Email = "test2@test.com",
            HomeAddress = "test2",
            Phone = "1231231232",
            SSN = "123456789102",
            MemberType = new MemberType()
            {
                MemberTypeName = "Student"
            }
        });

        //Member card list
        _memberCardList = new List<MemberCard>();
        _memberCardList.Add(new MemberCard()
        {
            CardID = "1",
            Created = DateTime.Now,
            Expires = DateTime.Now.AddDays(3),
            MemberID = 1,
            ProfileImageUrl = "www.test.com"
        });
        _memberCardList.Add(new MemberCard()
        {
            CardID = "2",
            Created = DateTime.Now,
            Expires = DateTime.Now.AddDays(-3),
            MemberID = 2,
            ProfileImageUrl = "www.test.com"
        });
    }

    [TestMethod]
    public void TestMemberExist()
    {
        var mockMember = new Mock<IMemberRepository>();
        mockMember.Setup(r => r.GetAll()).Returns(_memberList.AsQueryable());

        var result = mockMember.Object.CheckMemberExist("123456789102");

        Assert.IsTrue(result != null);
    }

0 个答案:

没有答案