[seasar-dotnet:586] Re: S2Assert.AreEqual での NullReference エラーが発生する時がある
Ryo Miyagi
[E-MAIL ADDRESS DELETED]
2007年 8月 27日 (月) 16:19:58 JST
宮城です。
nullが入ってくるケースがありますので
ご指摘の内容で修正いたしました。
今後とも何か問題がありましたらご連絡いただければと思います。
> いつもお世話になっております。
> 近藤です。
>
> S2Assert.AreEqualを使ったDataTable同士のテストでNullReferenceのエラーが発生する時があります。
> 詳細としましては、
> データベースは、Oracle
> S2Dao及び、S2Containerは、1.3.0を利用しています。
> --■テストコード--------------------------------------------
> ReadXlsWriteDb("Resource/data2.xls");
>
> this._hogeService.DoImport();
> List<Hoge> hoges = this._hogeLogic.GetAll();
>
> DataTable table = Converter.ToDataTable(hoges); ←IList<T>をDataTableに変換しています
>
> //UT00675
> DataSet dataSet = ReadXls("Service/UT00675.xls");
> S2Assert.AreEqual(dataSet.Tables[0], table, "UT00675");
>
> -------------------------------------------------------------
>
> 発生箇所は、
> Seasar.Extension.DataSets.Types.ObjectTypeのDoEquals内で、
> arg1とarg2に空文字が入っている場合に発生するみたいです。
>
> 60: protected virtual bool DoEquals(object arg1, object arg2)
> 61: {
> 62: try
> 63: {
> 64: if (IsNullable(arg1))
> 65: {
> 66: arg1 = DBNull.Value;
> 67: }
> 68: else
> 69: {
> 70: arg1 = Convert(arg1, null); ←ここarg1がnullになる
> 71: }
> 72: }
> 73: catch
> 74: {
> 75: return false;
> 76: }
> 77: try
> 78: {
> 79: if (IsNullable(arg2))
> 80: {
> 81: arg2 = DBNull.Value;
> 82: }
> 83: else
> 84: {
> 85: arg2 = Convert(arg2, null);
> 86: }
> 87: }
> 88: catch
> 89: {
> 90: return false;
> 91: }
> 92: return arg1.Equals(arg2); ←ここarg1がnullの時に発生
> 93: }
>
> 直感で、そのままEqualsで判定するのはまずいと思いましたが、
> その上の過程でありえない現象なのかもしれませんし・・・
>
> 下記のように回避策を施してみましたが他に回避策や、考えられる私のミスが
> 予想出来ましたらお教えください。
>
> 92: return arg1 != null ? arg1.Equals(arg2) : arg1 == arg2;
>
>
> どうぞよろしくお願いします。
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
seasar-dotnet メーリングリストの案内