2016-05-02 11 views
0

Ich habe diesen Test, der überprüft, ob ich die Query() in meiner Referenz aufrufen.Unit Tests LINQ, die eine Ganzzahl

[TestFixture] 
public class When_retrieving_an_application_license 
{ 
    [Test] 
    public void available_licenses_should_be_counted() 
    { 
     // Arrange 
     var sut = new LicenseManager(); 
     var mockILicenseRepository = new Mock<ILicenseRepository>(); 
     sut.LicenseRepository = mockILicenseRepository.Object; 
     // Act 
     sut.GetLicenseCount(Guid.NewGuid(), Guid.NewGuid()); 
     // Assert 
     mockIApplicationLicenseRepository.Verify(x => x.Query()); 
    } 
} 

jedoch die GetLicenseCount (Guid.NewGuid(), Guid.NewGuid()) Funktion wie folgt aussieht:

public int GetLicenseCount(Guid cId, Guid appId) 
      => LicenseRepository.Query() 
      .Count(al => al.CId == cId && al.AppId == appId 
             && al.UserId == null 
             && al.Expiry > DateTime.UtcNow); 

Query() liefert alle im Repo, die Benutzer-ID des zählen sind in Null. Ist es genug zu sagen, dass der Test in Ordnung ist, auch wenn es nur den query() Teil der linq verifiziert? Wie wäre es mit der Zählung?

+2

Ich bevorzuge verschiedene Tests für verschiedene Zwecke. Wenn Sie also überprüfen, ob eine Methode oder Eigenschaft aufgerufen wurde, und überprüfen, ob der Rückgabewert korrekt ist, sollten dies zwei Tests sein. Ich würde einen zweiten Test erstellen, der den Rückgabewert bestätigt. –

+3

Ich würde vorschlagen, Sie sollten nicht überprüfen, dass "Abfrage" überhaupt aufgerufen wird. Richten Sie Ihre Stub-Repository-Abfrage ein, um einige Werte zurückzugeben, und vergewissern Sie sich, dass Ihre Methode das Ergebnis liefert, das Sie für diese Werte erwarten würden. Testen Sie das * Verhalten *, nicht wie es implementiert ist. –

+0

Ich stimme @CharlesMager zu. Es ist nur Zeitverschwendung, die .Query() zu testen. Denken Sie daran, es ist wie eine SQL-Abfrage in Ihrer Anwendung. Unit Testen Sie die Domain, das Verhalten in Ihren Geschäftsanforderungen. – Spock

Antwort

0

Wenn Sie sicherstellen möchten, dass die richtige Anzahl zurückgegeben wird, müssen Sie Ihr verspottetes ILicenseRepository veranlassen, die erwarteten Daten zurückzugeben.

var mockILicenseRepository = new Mock<ILicenseRepository>(); 
mockILicenseRepository.Setup(x => x.Query()).Returns(new {CId = guid, AppId = guid2, Expiry = DateTime.Now.AddDays(1)}; 

Sie werden auch den Rückgabewert speichern müssen, um behaupten, gegen

var actualCount = sut.GetLicenseCount(Guid.NewGuid(), Guid.NewGuid()); 
Assert.AreEqual(expectedCount, actualCount); 

Wenn Sie jedoch Methode Abfrage Unit-Tests LINQ sind dann denke ich, Sie Ihre Produktion Code restrukturieren, weil Unit-Tests sollten Framework-Methoden ist nicht notwendig.

+0

Es sah so aus, als ob du Moq als dein spöttisches Framework benutzt hättest, also sind meine Beispiele mit dieser Syntax (meine Behauptung ist MsTest nicht sicher, was du benutzt hast). Nur zu deiner Information – JCisar