J'essaie de tester qu'une requête n'est pas sensible à la casse. Ce code de production fonctionne :
public ILookup<string, EEntry> GetEEntries(int batchId, List<string> employeeIds)
{
using (WithNoLock())
{
var result = from e in _entities.EEntries
where e.CPayBatchProcessId == batchId
&& (!e.Blocked.HasValue || e.Blocked.Value != true)
&& employeeIds.Contains(e.Id)
select e;
return result.ToLookup(e => e.Id, StringComparer.OrdinalIgnoreCase);
}
}
Je n'arrive pas à faire fonctionner le test unitaire. Ma première tentative a échoué parce que je crois que la liste était IEnumerable
au lieu de IQueryable
. Cependant, ma tentative de IQueryable
ne passe pas. La requête est sensible à la casse, et je ne veux pas qu'elle le soit. Voici ce que j'ai fait pour y remédier IQueryable
:
[TestCase("abc", "ABC")]
public void EEntriesAreCaseInsensitive(string employeeId1Input, string employeeId1Output)
{
var payEntries = new List<EEntry>
{
new EEntry() {CPayBatchProcessId = 8, Id = employeeId1Input},
new EEntry() {CPayBatchProcessId = 8, Id = "123"}
}.AsQueryable();
var payEntriesDbSet = new Mock<DbSet<EEntry>>();
payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.Provider).Returns(payEntries.Provider);
payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.Expression).Returns(payEntries.Expression);
payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.ElementType).Returns(payEntries.ElementType);
payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.GetEnumerator()).Returns(payEntries.GetEnumerator);
var context = new Mock<ISomeContext>();
context.Setup(x => x.EEntries).Returns(payEntriesDbSet.Object);
var employeeIds = new List<string>() { "aBc", "dEf", "gHi" };
var repo = new EEntriesRepository(context.Object);
var payEntryRecords = repo.GetEEntries(8, employeeIds);
Assert.IsTrue(payEntryRecords.Contains(employeeId1Output));
}
Qu'est-ce que je rate ?
Remarque : le getter pour EEntry.Id renvoie l'information suivante .ToUpper()
. Le code de production ignore correctement cela. Le code de test ne le fait pas.