2016-08-18 9 views
1

1.10.0 Mongoドライバから既存のプロジェクトを2.2.4にアップグレードし、MongoDB.Bson.BsonDocumentを継承するクラスで予期しない動作が発生しました。元の開発者はというクラスでnullBsonNull.Valueに変換することを目的としたBsonDocumentを拡張しました。ToStringがBsonDocumentの子クラスで正常に動作しない

ユニットテストでAssert.AreEqual(new BsonDocument("foo", "bar"), new BsonDocumentWithNulls("foo", "baz"));は失敗するはずですが、エラーメッセージがBsonDocumentWithNullsオブジェクトの値を認識しません。具体的には、エラーメッセージはAssert.AreEqual failed. Expected:<{ "foo" : "bar" }>. Actual:<[{ }]>.です。これはToStringと関係がありますが、修正方法はわかりません。

これはMongoドライバの1.10.0で動作するBsonDocumentWithNullsの実装ですが、2.2.4では動作しません。

public sealed class BsonDocumentWithNulls : BsonDocument 
    { 
     public BsonDocumentWithNulls() 
     { } 

     public BsonDocumentWithNulls(string key, BsonValue value) 
     { 
      if (value == null) 
       Add(key, BsonNull.Value); 
      else 
       Add(key, value); 
     } 

     public BsonDocumentWithNulls(IDictionary<string, object> dictionary) 
     { 
      foreach (var keyValue in dictionary) 
      { 
       if (keyValue.Value == null) 
        Add(keyValue.Key, BsonNull.Value); 
       else 
        Add(keyValue.Key, BsonValue.Create(keyValue.Value)); 
      } 
     } 
    } 

は、私はユニットテストでは、次のアサーションを行うことができます混乱に追加するには、すべてが値が実際にメモリに格納されている私に語った、動作します。

BsonDocument expected = new BsonDocument("foo", "bar"); 
BsonDocumentWithNulls actual = new BsonDocumentWithNulls("foo", "bar"); 

Assert.AreEqual(expected["foo"], actual["foo"]); 
Assert.AreEqual(expected.GetElement("foo"), actual.GetElement("foo")); 
Assert.AreEqual(expected, actual); 
//And just for sanity 
Assert.AreEqual("bar", actual["foo"]); 

私はさまざまな実装でToStringをオーバーライドしようとしました。

public override string ToString() 
{ 
    return base.ToString(); 
} 

public override string ToString() 
{ 
    BsonDocument doc = this.AsBsonDocument; 
    return doc.ToString(); 
} 

そして、私よりナイーブ/創造的な試みの一つが、私はあなたがその創造や素朴な場合には、裁判官ももらおう。

public override string ToString() 
{ 
    string retVal = string.Empty; 

    foreach(var val in this.Elements) 
    { 
     retVal += string.Format("{2}, \"{0}\" : \"{1}\" {3}", val.Name, val.Value, "{", "}"); 
    } 
    return retVal; 
} 

答えて

0

これは、答えよりもハックの詳細ですが、それは私が持っていたとBsonDocumentWithNullsのみ、それは周りのかなり簡単な作業でしたconstuctorsを実装しているので問題を通して私を得ました。

public sealed class BsonDocumentWithNulls : BsonDocument 
    { 
     public BsonDocument doc { get; set; } 

     public BsonDocumentWithNulls() 
     { 
      doc = new BsonDocument(); 
     } 

     public BsonDocumentWithNulls(string key, BsonValue value) 
     { 
      doc = new BsonDocument(); 
      if (value == null) 
       doc.Add(key, BsonNull.Value); 
      else 
       doc.Add(key, value); 
     } 

     public BsonDocumentWithNulls(IDictionary<string, object> dictionary) 
     { 
      doc = new BsonDocument(); 
      foreach (var keyValue in dictionary) 
      { 
       if (keyValue.Value == null) 
        doc.Add(keyValue.Key, BsonNull.Value); 
       else 
        doc.Add(keyValue.Key, BsonValue.Create(keyValue.Value)); 
      } 
     } 

     public override string ToString() 
     { 
      return doc.ToString(); 
     } 

     public BsonDocument ToBsonDocument() 
     { 
      return doc; 
     } 
    } 

このクラスの最も一般的な使用方法はそれだけでタックことは本当に簡単だった

var doc = new BsonDocumentWithNulls { 
    {"key1" : 1 }, 
    {"key2" : "val2" } 
}; 

のようなものでした。 ToBsonDocument()

var doc = new BsonDocumentWithNulls { 
    {"key1" : 1 }, 
    {"key2" : "val2" } 
}.ToBsonDocument(); 
関連する問題