Oto mój obiekt:Autofixture wygenerowania niestandardowej listy
public class Symbol
{
private readonly string _identifier;
private readonly IList<Quote> _historicalQuotes;
public Symbol(string identifier, IEnumerable<Quote> historicalQuotes = null)
{
_identifier = identifier;
_historicalQuotes = historicalQuotes;
}
}
public class Quote
{
private readonly DateTime _tradingDate;
private readonly decimal _open;
private readonly decimal _high;
private readonly decimal _low;
private readonly decimal _close;
private readonly decimal _closeAdjusted;
private readonly long _volume;
public Quote(
DateTime tradingDate,
decimal open,
decimal high,
decimal low,
decimal close,
decimal closeAdjusted,
long volume)
{
_tradingDate = tradingDate;
_open = open;
_high = high;
_low = low;
_close = close;
_closeAdjusted = closeAdjusted;
_volume = volume;
}
}
muszę instancję symbolu zaludnionych z listą cytując.
W moim teście chcę sprawdzić, czy mogę zwrócić wszystkie oferty, których cena zamknięcia jest niższa lub wyższa od określonej wartości. Oto moja próba:
[Fact]
public void PriceUnder50()
{
var msftIdentifier = "MSFT";
var quotes = new List<Quote>
{
new Quote(DateTime.Parse("01-01-2009"), 0, 0, 0, 49, 0, 0),
new Quote(DateTime.Parse("01-02-2009"), 0, 0, 0, 51, 0, 0),
new Quote(DateTime.Parse("01-03-2009"), 0, 0, 0, 50, 0, 0),
new Quote(DateTime.Parse("01-04-2009"), 0, 0, 0, 10, 0, 0)
};
_symbol = new Symbol(msftIdentifier, quotes);
var indicator = new UnderPriceIndicator(50);
var actual = indicator.Apply(_symbol);
Assert.Equal(2, actual.Count);
Assert.True(actual.Any(a => a.Date == DateTime.Parse("01-01-2009")));
Assert.True(actual.Any(a => a.Date == DateTime.Parse("01-04-2009")));
Assert.True(actual.Any(a => a.Price == 49));
Assert.True(actual.Any(a => a.Price == 10));
}
OK.
Teraz chcę to zrobić za pomocą Autofixture, jestem prawdziwym początkującym. Czytałem prawie wszystko, co mogłem w Internecie na temat tego narzędzia (blog autora, FAQ codeplex, kod źródłowy github). Rozumiem podstawowe cechy autoformowania, ale teraz chcę używać autofiltru w moim prawdziwym projekcie. Oto, co próbowałem do tej pory.
var msftIdentifier = "MSFT";
var quotes = new List<Quote>();
var random = new Random();
fixture.AddManyTo(
quotes,
() => fixture.Build<Quote>().With(a => a.Close, random.Next(1,49)).Create());
quotes.Add(fixture.Build<Quote>().With(a => a.Close, 49).Create());
_symbol = new Symbol(msftIdentifier, quotes);
// I would just assert than 49 is in the list
Assert.True(_symbol.HistoricalQuotes.Contains(new Quote... blabla 49));
Idealnie, wolałbym bezpośrednio stworzyć urządzenie o symbolu, ale nie wiem, jak dostosować moją listę cytatów. I nie jestem pewien, czy mój test jest ogólny, ponieważ w innym teście będę musiał sprawdzić, czy konkretna wartość jest powyżej, zamiast pod, więc powielę "kod urządzenia" i ręcznie dodam wycenę = 51.
Więc moje pytania to:
1 - Czy to jest sposób, w jaki ja mam użyć autofixture?
2 - Czy w moim przykładzie można poprawić sposób używania autofunkcji?
+1 @Gui i inne Mark jest zbyt grzeczny, aby go zgłosić, ale jego [Test zaawansowanej jednostki PluralSight] (http://pluralsight.com/training/courses/TableOfContents?CourseName=advanced-unit-testing) kurs jest klinem pełen tego rodzaju dobroci. Warto za to zapłacić, ale jeszcze lepiej mają darmowy okres próbny i nie mogę wymyślić lepszego sposobu na wykorzystanie go (choć oczywiście [Poza testem napędzanym] (http://pluralsight.com/training/Courses/TableOfContents/ outside-in-tdd) jest blisko drugiej) –
@ Mark Seemann Dzięki za komentarz Mark. Zgadzam się, że twój test jest zdecydowanie bardziej czytelny. Zamierzałem zadać jeszcze kilka pytań, ale twoja odpowiedź jest tak kompletna, że odpowiada na każde z moich pytań za każdym razem, gdy ponownie przeczytam twoją odpowiedź. Omg, prawdopodobnie jesteś bogiem testów jednostkowych. – Gui
Co powiesz na dodanie metod rozszerzenia dla 'WithClose',' WithLimit' * zdefiniowanych w projekcie testowym *, zamiast dodawać je jako metody instancji? (teraz w C# 6, nie muszą nawet być w statycznych klasach) –