2015-05-09 5 views
7

Ich habe eine Spezifikation für eine Methode, die einen Zeitstempel eines ActiveRecord-Objekts zurückgibt.CircleCI: Fehler mit einer Spezifikation mit Zeitstempeln

Die Spezifikation wird lokal übergeben. Wenn sie jedoch auf CircleCI ausgeführt wird, besteht eine geringfügige Abweichung zwischen erwartetem und tatsächlichem Wert.

Die Spezifikation sieht in etwa wie folgt aus:

describe '#my_method' do 
    it 'returns created_at' do 
    object = FactoryGirl.create(:something) 
    expect(foo.bar(object)).to eq object.created_at 
    end 
end 

Während es vor Ort passiert, auf CircleCI, ich ständig ähnliche Fehlermeldungen.

Hier sind einige Beispiele:

(1)

expected: 2015-05-09 10:42:59.752192641 +0000 
got: 2015-05-09 10:42:59.752192000 +0000 

(2)

expected: 2015-05-08 10:16:36.777541226 +0000 
got: 2015-05-08 10:16:36.777541000 +0000 

Aus dem Fehler, ich vermute, dass CircleCI wird der Zeitstempel aufrunden, aber ich tun habe nicht genug Informationen. Irgendwelche Vorschläge?

+0

Es ist am besten, das Problem an Circle CI-Supportpersonal zu melden. Sie sind wahrscheinlich besser gerüstet, um eine Erklärung für das Geschehen zu geben. –

Antwort

4

Ich habe das gleiche Problem und habe derzeit ein offenes Ticket mit CircleCI, um weitere Informationen zu erhalten. Ich werde diese Antwort aktualisieren, wenn ich mehr weiß.

In der Zwischenzeit ist eine Problemumgehung, um diese Tests zu erhalten, nur um sicherzustellen, dass der Zeitstempel, mit dem Sie in einem solchen Test arbeiten, mit einer Bibliothek gerundet wird, die Zeit verspottet (wie timecop).

describe '#my_method' do 
    it 'returns created_at' do 
    # CircleCI seems to round milliseconds, which can result in 
    # slight differences when serializing times. 
    # To work around this, ensure the millseconds end in 000. 

    Timecop.freeze(Time.local(2015)) do 
     object = FactoryGirl.create(:something) 
     expect(foo.bar(object)).to eq object.created_at 
    end 
    end 
end 

UPDATE: Basierend auf der anfänglichen Antwort von CircleCI, ist der obige Ansatz tatsächlich ihr empfohlene Ansatz. Sie konnten mir noch keine Erklärung geben, warum die Rundung tatsächlich stattfindet.

UPDATE 2: Es sieht so aus, als hätte dies etwas mit dem Präzisionsunterschied zwischen verschiedenen Systemen zu tun. Ich sehe persönlich dieses Thema auf OS X. Hier ist die Antwort von Circle:

Von dem, was ich weiß, Time.now tatsächlich unterschiedliche Präzision auf OS X und Linux-Maschinen hat. Ich nehme an, dass Sie das gleiche Ergebnis auf anderen Linux-Hosts erhalten, aber alle OS X-Hosts geben Ihnen das Ergebnis ohne Rundung. Ich könnte mich irren, aber ich erinnere mich daran, mit einem anderen Kunden über zu sprechen. Denken Sie daran, das auf einer VM oder einer EC2 Instanz unter Linux zu überprüfen?

In der Zeitreferenz können Sie auf der Seite nach Präzision suchen - die Rundungsmethode kann die Genauigkeit für Sie tatsächlich anpassen. Wäre es eine Option für Sie, um die Zeit in der Behauptung innerhalb des Tests zu runden?

Ich habe ihre Vorschläge noch nicht ausprobiert, um zu bestätigen, aber dies eine Erklärung sowie eine zusätzliche Abhilfe zu schaffen, scheint (die Behauptung innerhalb der Test Rundung), die nicht timecop erfordert.

+1

Gefrierzeit bis zur Usec funktionierte nicht für mich. Ich wechselte zum rspec-Matcher 'be_within' –

Verwandte Themen