ファイル名を指定して実行!サービス
tips
services.msc
【C#】App.configにJSONで設定値を定義
概要
とあるクライアントアプリでリスト形式の設定値を外部ファイル化したいよねって話があって、App.configにadd
タグで大量に定義するか悩んで、Json.NETを使ってJSON形式で設定してみることにしました。
add
タグたくさん書くのは気が引ける。
<appSettings> <!--users--> <add key="1" value="aaa" /> <add key="2" value="bbb" /> <add key="3" value="ccc" /> </appSettings>
環境
Visual Studio Community 2017
実装
パッケージマネージャーコンソールよりJson.NETをインストールしておきます。
PM> Install-Package Newtonsoft.Json
App.config
add
の定義は一つだけ。あれ、読みにくい?
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <appSettings> <add key="users" value='[ {"ID":"1","Name":"aaa"}, {"ID":"2","Name":"bbb"}, {"ID":"3","Name":"ccc"}, ]'/> </appSettings> </configuration>
Program.cs
とは言え、コンフィグから値を読み出す処理はkey
一つでいいのでシンプル。add
タグを連ねてたら動的に読んだりするし。
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Configuration; namespace ConsoleApp2 { class Program { static void Main(string[] args) { var users = ConfigurationManager.AppSettings["users"]; var paramList = JsonConvert.DeserializeObject<List<User>>(users); foreach (var param in paramList) { Console.WriteLine(param.ID + ":" + param.Name); } Console.ReadKey(true); } } class User { public String ID { get; set; } public String Name { get; set; } } }
実行結果
取れてるっぽいので、あとはデータソースに突っ込むだけ!
1:aaa 2:bbb 3:ccc
【.NET Core】MoqのQuickstartをやってみる(Miscellaneous)
概要
Miscellaneousってなんだろう?と思って調べたら「その他」とか「雑多な」とかって意味らしい。略してmisc。
テストコード
呼び出し回数に応じて戻り値や例外投げる方法とprotectedメンバーのセットアップについてですね。思ってたより雑多感はない。
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Moq.Protected; using MoqQuickstart; namespace MoqQuickstart.Tests { [TestClass] public class Miscellaneous { [TestMethod] public void setting_up_a_member_to_return_different_values_throw_exceptions_on_sequential_calls(){ var mock = new Mock<IFoo>(); mock.SetupSequence(f => f.GetCount()) .Returns(3) // will be returned on 1st invocation .Returns(2) // will be returned on 2nd invocation .Returns(1) // will be returned on 3rd invocation .Returns(0) // will be returned on 4th invocation .Throws(new InvalidOperationException()); // will be thrown on 5th invocation var foo = mock.Object; var first = foo.GetCount(); var second = foo.GetCount(); var third = foo.GetCount(); var fourth = foo.GetCount(); Assert.AreEqual(3,first); Assert.AreEqual(2,second); Assert.AreEqual(1,third); Assert.AreEqual(0,fourth); try { var fifth = foo.GetCount(); Assert.Fail(); } catch(InvalidOperationException) { Assert.IsTrue(true); } } [TestMethod] public void setting_expectations_for_protected_members() { var mock = new Mock<CommandBase>(); mock.Protected() .Setup<int>("Execute") .Returns(5); mock.Protected() .Setup<string>("Execute", ItExpr.IsAny<string>()) .Returns("foo"); Assert.AreEqual(5, mock.Object.Processing()); Assert.AreEqual("foo", mock.Object.Processed("bar")); } } }
QuickstartのページにはCommandBase
クラスの記述がないので、これも追加で。
using System; namespace MoqQuickstart { public class CommandBase { public int Processing() { return Execute(); } public string Processed(string s) { return Execute(s); } protected virtual int Execute() { return 0; } protected virtual string Execute(string s) { return "fix:" + s; } } }
テストを実行してみましょう。
$ dotnet test --filter "FullyQualifiedName~MoqQuickstart.Tests.Miscellaneous" Build started, please wait... Build completed. Test run for /Users/soil/src/github/unit-testing-using-dotnet-test/PrimeService.Tests/bin/Debug/netcoreapp2.0/PrimeService.Tests.dll(.NETCoreApp,Version=v2.0) Microsoft (R) Test Execution Command Line Tool Version 15.3.0-preview-20170628-02 Copyright (c) Microsoft Corporation. All rights reserved. テスト実行を開始しています。お待ちください... テストの合計数: 2。成功: 2。失敗:0。スキップ: 0。 テストの実行に成功しました。 テスト実行時間: 2.8108 秒
ミスレニアス?ミセレイニアス?
Miscellaneousでしょう。