[seasar-dotnet:1261] MbUnitでのRowTestの利用

Kudoh Satoshi [E-MAIL ADDRESS DELETED]
2009年 2月 12日 (木) 08:14:09 JST


工藤と申します。いつもお世話になっております。

非常に限定的な環境でのことなのであまり参考にならないと思うのですが、
情報提供ということで投稿します。

・.NET Framework 1.1
・S2Container.NET 1.2.9
・MbUnit 2.41

S2Unit.NET + MbUnitの環境で [Row], [RowTest] を使おうとしたのですが、
Null参照の例外が発生します。

調べた結果、以下のことが判明しました。

-----
Seasar.Framework.Unit/S2FrameworkTestCaseRunner の Run() メソッドで落ちる。

  public virtual object Run(IRunInvoker invoker, object o, IList args)

このメソッドでは invoker.Name を使ってテストメソッドを取得している。
RowAttribute を指定したメソッドの場合は、invoker.Name には引数も含めた
メソッド名が入っている。

  [Test][S2]
  public void test() {...}     ----> invoker.Name == "test"

  [Row(1)][RowTest][S2]
  public void test(int a) {...} ---> invoker.Name == "test(int)"

本来であれば "test" を取得すべきところ、"test(int)" を取得しようとする。
このため、メソッドの取得に失敗しNull参照が発生する。

-----

ということで、invoker.Name からメソッド名のみを取り出すようにすれば、
問題は回避できます。

s2container.net/source/Seasar.Unit/Seasar.Framework.Unit/
S2FrameworkTestCaseRunner.cs

***************
*** 43,53 ****
  		{
  			get { return container; }
  		}
  
  		public virtual object Run(IRunInvoker invoker, object o, IList args)
  		{
  			fixture = o as S2FrameworkTestCaseBase;
! 			method = fixture.GetType().GetMethod(invoker.Name);
  			SetUpContainer();
  			fixture.Container = container;
  			try
--- 43,58 ----
  		{
  			get { return container; }
  		}
+ 		private string getMethodName(string name) 
+ 		{
+ 			if (name.IndexOf("(") == -1) return name;
  
+ 			return name.Substring(0, name.IndexOf("("));
+ 		}
  		public virtual object Run(IRunInvoker invoker, object o, IList args)
  		{
  			fixture = o as S2FrameworkTestCaseBase;
! 			method = fixture.GetType().GetMethod(getMethodName(invoker.Name));
  			SetUpContainer();
  			fixture.Container = container;
  			try

----

以上
_______________________________________________
工藤聡


seasar-dotnet メーリングリストの案内