1.10.0 Mongoドライバから既存のプロジェクトを2.2.4にアップグレードし、MongoDB.Bson.BsonDocument
を継承するクラスで予期しない動作が発生しました。元の開発者はというクラスでnull
をBsonNull.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;
}