我想通過我的服務層使用Moq來測試在我的存儲庫上使用的lambda。單元測試ServiceLayer與lambda和Moq
的服務:
public class CompanyService : TuneUpLog.ServiceLayer.ICompanyService
{
private IRepository<Company> _repository;
private IValidationDictionary _validatonDictionary;
private Guid _userId;
public CompanyService(Guid userId,IValidationDictionary validationDictionary, ObjectContext context)
: this(userId, validationDictionary, new Repository<Company>(context))
{
}
public CompanyService(Guid userId, IValidationDictionary validationDictionary, IRepository<Company> repository)
{
_validatonDictionary = validationDictionary;
_repository = repository;
if (userId == Guid.Empty)
throw new SecurityException("UserId is required");
else
_userId = userId;
}
public IEnumerable<Company> ListCompany()
{
return _repository.Find(c => c.Users.Any(u => u.UserId == _userId));
}
}
測試:
[TestMethod]
public void ListCompany_1Valid1Invalid_ReturnsValidCompany()
{
Mock<IRepository<Company>> fakeCompanyRepository = new Mock<IRepository<Company>>();
CompanyService companyService = new CompanyService(USER_ID, new ModelStateWrapper(_modelState), fakeCompanyRepository.Object);
//1 company for this user and 1 that isn't for this user
List<Company> companies = new List<Company>()
{
new Company() { Id = 1, Name = "Test Company", AccountTypeId = 1, Users = { new User() { UserId = USER_ID } } },
new Company() { Id = 2, Name = "2nd Test Company", AccountTypeId = 1, Users = { new User() { UserId = Guid.Empty } } }
};
fakeCompanyRepository.Setup(c => c.Find(It.IsAny<Expression<Func<Company, bool>>>())).Returns(companies.AsQueryable());
//count should be 1
Assert.AreEqual(1, companyService.ListCompany().Count());
}
資源庫:
public interface IRepository<T> where T : class, IEntity
{
void Add(T newEntity);
void Edit(T entity);
IQueryable<T> Find(Expression<Func<T, bool>> predicate);
IQueryable<T> FindAll();
T FindById(int id);
void Remove(T entity);
void Attach(T entity);
}
測試是兩家公司迴歸,而不是第一個公司,我期待。我究竟做錯了什麼?
當你把一個放在ListCompany()方法中時,斷點會告訴你什麼? –
由於存儲庫被嘲笑,ListCompany方法中的斷點並沒有給我多少提示。下面是對資源庫中的模擬信息,但它似乎並不像這將是多大的幫助:\t \t行爲\t寬鬆\t Moq.MockBehavior \t \t CallBase \t假\t布爾 \t \t默認值\t空\t Moq.DefaultValue –
沒錯,所以如果存儲庫被嘲弄......我認爲用戶標識上的過濾器沒有得到應用似乎是合乎邏輯的。 –