/// <summary> /// 引数に指定したDtDirectoryUsageをDT_DIRECTORY_USAGEテーブルへ登録する /// </summary> /// <param name="inData">登録するデータ</param> /// <returns>追加したデータ。エラーが発生した場合には例外を投げるためnullを返さない</returns> public DtDirectoryUsage CreateDtDirectoryUsageIfAlreadyMessageThrowEx(DtDirectoryUsage inData) { DtDirectoryUsage model = null; try { _logger.EnterJson("{0}", inData); DBAccessor.Models.DtDirectoryUsage entity = new DBAccessor.Models.DtDirectoryUsage(inData); _dbPolly.Execute(() => { // メッセージIDがなければ追加 using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { var addedAlready = db.DtDirectoryUsage.FirstOrDefault(x => x.MessageId == inData.MessageId); if (addedAlready != null) { throw new RmsAlreadyExistException(string.Format("MessageId [{0}] はすでに追加済みです。", inData.MessageId)); } var dbdata = db.DtDirectoryUsage.Add(entity).Entity; db.SaveChanges(_timePrivder); model = dbdata.ToModel(); } }); return(model); } catch (RmsAlreadyExistException) { throw; } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_DIRECTORY_USAGEテーブルへのInsertに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
public void CreateDtDirectoryUsageIfAlreadyMessageThrowExTest( string no, string in_InsertNewDataSqlPath, string in_DeleteNewDataSqlPath, string expected_DataJsonPath, string expected_ExceptionType, string expected_ExceptionMessage, string remarks) { // 初期データ挿入 RepositoryTestHelper.ExecInsertSql(in_InsertNewDataSqlPath); // データを作成する var baseDateTime = DateTime.UtcNow; var newDirectoryUsageData = new DtDirectoryUsage() { DeviceSid = 1, SourceEquipmentUid = RepositoryTestHelper.CreateSpecifiedNumberString(30), // 上限値いっぱい MessageId = RepositoryTestHelper.CreateSpecifiedNumberString(64), // 上限値いっぱい、既存でないメッセージID CreateDatetime = baseDateTime }; if (expected_ExceptionType == typeof(RmsException).FullName) { // 存在しないSidを指定する newDirectoryUsageData.DeviceSid = 999; } else if (expected_ExceptionType == typeof(ArgumentNullException).FullName) { newDirectoryUsageData = null; } else if (expected_ExceptionType == typeof(RmsAlreadyExistException).FullName) { newDirectoryUsageData.MessageId = "hoge"; // 既存のメッセージID } else if (expected_ExceptionType == typeof(RmsParameterException).FullName) { if (expected_ExceptionMessage.Contains("SourceEquipmentUid")) { newDirectoryUsageData.SourceEquipmentUid = RepositoryTestHelper.CreateSpecifiedNumberString(65); // 上限値+1 } else if (expected_ExceptionMessage.Contains("MessageId")) { newDirectoryUsageData.MessageId = RepositoryTestHelper.CreateSpecifiedNumberString(65); // 上限値+1、既存でないメッセージ } } string exceptionName = ""; string exceptionMessage = ""; try { var createdDirectoryUsageData = _directoryUsageRepository.CreateDtDirectoryUsageIfAlreadyMessageThrowEx(newDirectoryUsageData); if (createdDirectoryUsageData != null) { // 作成日時はDB側で設定されることを確認する Assert.AreNotEqual(baseDateTime, createdDirectoryUsageData.CreateDatetime); // 比較に使用しない値はnull or 固定値とする createdDirectoryUsageData.CreateDatetime = DateTime.Parse("2020/4/1 0:00:00"); } // データのjson化 string readJson = Utility.ObjectExtensions.ToStringJson(createdDirectoryUsageData); string expectJson = null; if (File.Exists(expected_DataJsonPath)) { expectJson = File.ReadAllText(expected_DataJsonPath); } // データの比較 Assert.AreEqual(expectJson, readJson); // TODO DBデータ内容をチェックする } catch (RmsAlreadyExistException e) { exceptionName = e.GetType().FullName; exceptionMessage = e.Message; } catch (RmsParameterException e) { exceptionName = e.GetType().FullName; exceptionMessage = e.Message; } catch (RmsException e) { exceptionName = e.GetType().FullName; exceptionMessage = e.Message; } catch (ArgumentNullException e) { exceptionName = e.GetType().FullName; exceptionMessage = typeof(DtDirectoryUsage).FullName + " is null."; // HACK ←の部分をメッセージから抽出できれば... } // 例外発生チェック Assert.AreEqual(expected_ExceptionType, exceptionName); Assert.AreEqual(expected_ExceptionMessage, exceptionMessage); // 後処理 RepositoryTestHelper.ExecDeleteSql(in_DeleteNewDataSqlPath); }