public void GetExchangeRateOnceWillReturnRateFromInnerCurrency(decimal expectedExchangeRate, string currencyCode, [Frozen] Mock <Currency> innerCurrencyStub, CachingCurrency sut) { // Fixture setup innerCurrencyStub.Setup(c => c.GetExchangeRateFor(currencyCode)).Returns(expectedExchangeRate); // Exercise system var result = sut.GetExchangeRateFor(currencyCode); // Verify outcome Assert.Equal <decimal>(expectedExchangeRate, result); // Teardown (implicit) }
public void InnerCurrencyIsInvokedAgainWhenCacheExpires() { // Fixture setup var currencyCode = "CHF"; var cacheTimeout = TimeSpan.FromHours(1); var startTime = new DateTime(2009, 8, 29); var timeProviderStub = new Mock <TimeProvider>(); timeProviderStub .SetupGet(tp => tp.UtcNow) .Returns(startTime); TimeProvider.Current = timeProviderStub.Object; var innerCurrencyMock = new Mock <Currency>(); innerCurrencyMock .Setup(c => c.GetExchangeRateFor(currencyCode)) .Returns(4.911m) .Verifiable(); var sut = new CachingCurrency(innerCurrencyMock.Object, cacheTimeout); sut.GetExchangeRateFor(currencyCode); sut.GetExchangeRateFor(currencyCode); sut.GetExchangeRateFor(currencyCode); timeProviderStub .SetupGet(tp => tp.UtcNow) .Returns(startTime + cacheTimeout); // Exercise system sut.GetExchangeRateFor(currencyCode); // Verify outcome innerCurrencyMock.Verify( c => c.GetExchangeRateFor(currencyCode), Times.Exactly(2)); // Teardown (implicit) }