2013-10-31 66 views
0

場景:我有一個具有可空屬性的對象,當我運行被測方法時它將被更新。在預期的對象中,我沒有指定它,因爲我想單獨驗證該值。下面是一個簡單的試驗示範FluentAssertions在比較對象時會失敗,如果一個屬性可以爲空

using System; 
using FluentAssertions; 
using NUnit.Framework; 

namespace FluentAssertionsNullableFailure 
{ 
    public class SimpleWithNullable 
    { 
     public Int64? nullableIntegerProperty 
     { get; set; } 

     public string strProperty 
     { get; set; } 
    } 

    [TestFixture] 
    public class Demo 
    { 
     public SimpleWithNullable actual = new SimpleWithNullable { nullableIntegerProperty = 1, strProperty = "I haz a string!" }; 
     public SimpleWithNullable expected = new SimpleWithNullable { strProperty = "I haz a string!" }; 

     [Test] 
     public void NullableTest() 
     { 
      actual.ShouldBeEquivalentTo (
       expected, 
       opt => opt.Using<Int64?> (c => c.Subject.Should().BeInRange (0, 10)).WhenTypeIs<Int64?>() 
      ); 
     } 
    } 
} 

然而,這種失敗,出現以下消息:

Test Name: NullableTest 
Test FullName: FluentAssertionsNullableFailure.Demo.NullableTest 
Test Source: c:\Users\ebelew\Documents\Visual Studio 2012\Projects\FluentAssertionsNullableFailure\FluentAssertionsNullableFailure\Demo.cs : line 25 
Test Outcome: Failed 
Test Duration: 0:00:00.271 

Result Message: 
Expected property nullableIntegerProperty to be <null>, but found 1. 

With configuration: 
- Select all declared properties 
- Match property by name (or throw) 
- Invoke Action<Nullable`1> when info.RuntimeType.IsSameOrInherits(System.Nullable`1[System.Int64]) 
- Invoke Action<DateTime> when info.RuntimeType.IsSameOrInherits(System.DateTime) 
- Invoke Action<String> when info.RuntimeType.IsSameOrInherits(System.String) 
Result StackTrace: 
at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in d:\Workspace\Github\FluentAssertions\FluentAssertions.Net35\Execution\LateBoundTestFramework.cs:line 25 
at FluentAssertions.Execution.CollectingAssertionStrategy.ThrowIfAny(IDictionary`2 context) in d:\Workspace\Github\FluentAssertions\FluentAssertions.Net35\Execution\CollectingAssertionStrategy.cs:line 57 
at FluentAssertions.Execution.AssertionScope.Dispose() in d:\Workspace\Github\FluentAssertions\FluentAssertions.Net35\Execution\AssertionScope.cs:line 267 
at FluentAssertions.Equivalency.EquivalencyValidator.AssertEquality(EquivalencyValidationContext context) in d:\Workspace\Github\FluentAssertions\FluentAssertions.Net35\Equivalency\EquivalencyValidator.cs:line 55 
at FluentAssertions.AssertionExtensions.ShouldBeEquivalentTo[T](T subject, Object expectation, Func`2 config, String reason, Object[] reasonArgs) in d:\Workspace\Github\FluentAssertions\FluentAssertions.Net35\AssertionExtensions.cs:line 497 
at FluentAssertionsNullableFailure.Demo.NullableTest() in c:\Users\ebelew\Documents\Visual Studio 2012\Projects\FluentAssertionsNullableFailure\FluentAssertionsNullableFailure\Demo.cs:line 25 

我怎麼能做到這一點與期權方面,而不是分裂成兩個或更多的斷言。 (一個主張爲共同屬性,一個爲範圍或期望值而不是嚴格等值的項目)

注意:對於expected對象,沒有明確值的引用類型也會失敗。

注意:我試過ExcludingMissingProperties(),它不會改變錯誤。

回答