2016-07-12 27 views
4

Ich benutze asp netcore 1.0 und xunit.Mock IMemoryCache im Komponententest

Ich versuche, einen Komponententest für Code zu schreiben, der IMemoryCache verwendet. Wenn ich jedoch versuche, einen Wert in IMemoryCache zu setzen, bekomme ich einen Null-Referenzfehler.

Der Testcode meines Geräts lautet wie folgt:
Der IMemoryCache wird in die Klasse eingefügt, die ich testen möchte. Wenn ich jedoch versuche, im Test einen Wert im Cache zu setzen, bekomme ich eine Nullreferenz.

public Test GetSystemUnderTest() 
{ 
    var mockCache = new Mock<IMemoryCache>(); 

    return new Test(mockCache.Object); 
} 

[Fact] 
public void TestCache() 
{ 
    var sut = GetSystemUnderTest(); 

    sut.SetCache("key", "value"); //NULL Reference thrown here 
} 

Und das ist die Klasse-Test ...

public class Test 
{ 
    private readonly IMemoryCache _memoryCache; 
    public Test(IMemoryCache memoryCache) 
    { 
     _memoryCache = memoryCache; 
    } 

    public void SetCache(string key, string value) 
    { 
     _memoryCache.Set(key, value, new MemoryCacheEntryOptions {SlidingExpiration = TimeSpan.FromHours(1)}); 
    } 
} 

Meine Frage ist ... Muss ich Setup müssen die IMemoryCache irgendwie? Setzen Sie einen Wert für den DefaultValue? Wenn IMemoryCache Mocked ist, was ist der Standardwert?

Danke.

+0

können Sie zeigen, ein [MCVE], wie Sie die Abhängigkeit in Ihrer Klasse verwenden. Dies wird bestimmen, wie Sie den Mock einrichten müssen. – Nkosi

+0

Ich habe aktualisiert, um den Rest des Codes anzuzeigen. –

+0

Wird die Ausnahme ausgelöst, weil sut null ist oder bei der Ausführung des _memoryCache.Set-Aufrufs in der setcache-Methode ausgelöst wird? – Macilquham

Antwort

3

Vorausgesetzt, Sie versuchen zu testen, dass IMemoryCache.Set aufgerufen wird, sollten Sie diese Methode einrichten und überprüfen, dass es wie erwartet aufgerufen wurde, wenn Sie den Komponententest ausführen.

Mit Moq Rahmen, kann dies geschehen wie folgt:

[Fact] 
public void TestCache() 
{ 
    //Arrange 
    var mockCache = new Mock<IMemoryCache>(); 
    //Setup the mock 
    mockCache.Setup(m => m.Set(It.Any<string>(),It.Any<string>(),It.Any<MemoryCacheEntryOptions>()).Verifiable(); 

    sut = new Test(mockCache.Object); 

    //Act 
    sut.SetCache("key", "value"); 

    //Assert 
    mockCache.Verify();//verifies that method was called matching setup  
} 

ODER

[Fact] 
public void TestCache() 
{ 
    //Arrange 
    var mockCache = new Mock<IMemoryCache>(); 

    sut = new Test(mockCache.Object); 

    //Act 
    sut.SetCache("key", "value"); 

    //Assert 
    mockCache.Verify(m => m.Set(It.Any<string>(),It.Any<string>(),It.Any<MemoryCacheEntryOptions>(), Times.AtLeastOnce());//verifies that method was called matching provided setup 
} 
+0

Welche Bibliothek muss ich Mock Methode anrufen? – TTCG

+0

@TTCG checken Sie die Moq-Bibliothek aus - [Github] (https://github.com/moq/moq4), [nuget] (https://github.com/moq/moq4) – Nkosi

+0

Weil die 'Set'-Methode ist eine Erweiterung, Sie können es nicht verspotten - siehe https://stackoverflow.com/questions/42381018/mock-imemorycache-with-moq-throwing-exception für eine vollständigere Lösung. – Matty

Verwandte Themen