试图抓住工作单元和存储库模式,并构建了下面的代码,我现在正试图在一个单独的组件中测试它。
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);
}