1

インスタンスをスリム シンボル ($IT) に保存しますが、後で関数呼び出しでインスタンスを使用しようとすると、fitSharp.Machine.Exception.ParseException を受け取ります。

問題は、FitSharp がオブジェクトをそのインターフェイスにキャストするのではなく、引数を解析しようとすることだと思います。

私は次のクラスとインターフェースを持っています (名前空間は MySlimTest です)

public interface IObject {}
public class ConcreteObject: IObject
{
    public string Name { get; set; }
    public string Description { get; set; }
}

これは、次のメソッドを含むスリム フィクスチャで使用し、返されたインスタンスをスリム シンボルに格納します。

public IObject CreateConcreteObjectWithNameAndDescription(string name, string description)
{
    return new ConcreteObject() {Name = name, Description = description};
}

このメソッドをスクリプト テーブルから呼び出します。テストの実行後にレンダリングすると、次のようになります。

$IT<-[MySlimTest.ConcreteObject] | create concrete object | with name | The initial name of the concrete object | and description | empty |

スリム シンボル IT に格納されているインスタンスを後で使用しようとすると、ParseException がスローされます。

フィクスチャのメソッドは

public bool SetNameForInstance(string name, IObject obj)
{
    return SetAttribute<ConcreteObject>(obj, concreteObject => concreteObject.Name = name);
}

これはテストテーブルで次のように使用されます

ensure | set name | John Cleese | for instance | $IT->[MySlimTest.ConcreteObject]

回避策

興味深いことに、インターフェイスの代わりに実装 (ConcreteObject) を使用するようにメソッド シグネチャを変更すると、機能します。

public bool SetNameForInstance(string name, ConcreteObject obj)

フィクスチャ コードを含む完全な例は、fitnesse プレーン テキスト wiki ページとして続きます。

!*> Environment
Linux 3.2.0-3-amd64 #1 SMP Mon Jul 23 02:45:17 UTC 2012 x86_64 GNU/Linux
Mono 2.10.8.1 (Debian 2.10.8.1-7) (64-bit)
glib-sharp 2.12.0.0
FitNesse (v20121220)
FitSharp release 2.2 for .net 4.0
*!

!*> Fixture Code
{{{
using System;

namespace MySlimTest
{
    public interface IObject {}

    public class ConcreteObject: IObject
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

    public class SymbolTestFixture
    {
        public SymbolTestFixture ()
        {
            // Initialisation code here...
            // Currently just a mock.
    }

    public IObject CreateConcreteObjectWithNameAndDescription(string name, string description)
    {
        return new ConcreteObject() {Name = name, Description = description};
    }

    public bool SetNameForInstance(string name, IObject obj)
    {
        return SetAttribute<ConcreteObject>(obj, concreteObject => concreteObject.Name = name);
    }

    public bool SetDescriptionForInstance(string description, ConcreteObject obj)
    {
        return SetAttribute<ConcreteObject>(obj, concreteObject => concreteObject.Description = description);
    }

    private bool SetAttribute<T>(IObject obj, Action<T> fun)
    {
    if (obj is T)
    {
        fun((T)obj);
            return true;
    }
        return false;
    }
    }
}

}}}
*!


!3 Set-up of the test system

!***> Test system set-up
!define TEST_SYSTEM {slim}
!path /path/to/fixture/DLL/SlimTest.dll
!define COMMAND_PATTERN {%m -r fitSharp.Slim.Service.Runner,/path/to/fitSharp.dll %p}
!define TEST_RUNNER {/path/to/Runner.exe}
***!

!**> Usings
!|import   |
|MySlimTest|
**!

!2 Scenarios

!|scenario|given concrete object           |name |and            |description |
|$IT=     |create concrete object with name|@name|and description|@description|

!|scenario            |given concrete object|name     |
|given concrete object|@name                |and|empty|

!|scenario|edit concrete object|instance    |name to     |name|and description to|description|
|ensure   |set name            |@name       |for instance|$IT                                |
|ensure   |set description     |@description|for instance|$@instance                         |

!3 Test the ''slim symbol can hold object as parameter'' feature

!|script|symbol test fixture|

!|script                                                                                                                                                                   |
|given concrete object|The initial name of the concrete object                                                                                                             |
|edit concrete object |IT      |name to     |John Cleese |and description to|Yes, I am still indeed alive, contrary to rumour, and I am touring my one Cleese show. London.|
4

1 に答える 1

0

バグです。フォークして修正し、GitHub でプル リクエストを作成しました

https://github.com/jediwhale/fitsharp/pull/109

于 2013-03-04T08:28:57.287 に答える