13

私が次を持っているとしましょう:

public interface ISession 
{
   T Get<T>(dynamic filter); }
}

そして、私がテストしたい次のコードがあります:

var user1 = session.Get<User>(new {Name = "test 1"});
var user2 = session.Get<User>(new {Name = "test 2"});

この呼び出しをどのようにモックしますか?

Moqを使用して、私はこれを行うのに疲れました:

var sessionMock = new Mock<ISession>();
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 1});
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 2});

そして、それはうまくいきませんでした。返される結果はnullです

また、RhinoMocksで次のことを試みました。

var session = MockRepository.GenerateStub<ISession>();
session.Stub(x => x.Get<User>(new {Name = "test 1"})).Return(new User{Id=1});

運もありません。再びヌル。

では、これをどのように行うのでしょうか?

ありがとう、

4

3 に答える 3

34

It.Is<object>マッチャーはリフレクションと併用できます。式ツリーで動的を使用することはできないため、機能しIt.Is<dynamic>ません。そのため、名前でプロパティ値を取得するにはリフレクションが必要です。

sessionMock
    .Setup(x => x.Get<User>(
        It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 1")))
    .Returns(new User{Id = 1});
sessionMock
    .Setup(x => x.Get<User>(
        It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 2")))
    .Returns(new User { Id = 2 });

GetPropertyValue少しヘルパーはどこにありますか:

public static class ReflectionExtensions
{
    public static T GetPropertyValue<T>(this object obj, string propertyName)
    {
        return (T) obj.GetType().GetProperty(propertyName).GetValue(obj, null);
    }
}
于 2012-05-05T06:45:03.937 に答える
3

It.IsAny<T>その場合に提供されたMoq

sessionMock.Setup(x => x.Get<User>(It.IsAny<object>()).Returns(new User());

*動的は任意のオブジェクトです

于 2012-05-05T04:08:59.003 に答える
1

まず第一に、匿名オブジェクトは実際にはそうではありませんdynamic

dynamic次のようなオブジェクトを使用した場合

dynamic user1Filter = new ExpandoObject();
user1Filter.Name = "test 1";
var user1 = session.Get<User>(user1Filter);

あなたはそれを次のように嘲笑することができます

sessionMock.Setup(x => x.Get<User>(DynamicFilter.HasName("test 1")));

カスタム引数マッチャーを実装することにより:

static class DynamicFilter
{
    [Matcher] public static object HasName(string name) { return null; }
    public static bool HasName(dynamic filter, string name)
    {
        string passedName = filter.Name; //dynamic expression
        return name.Equals(passedName);
    }
}
于 2013-10-21T15:21:04.003 に答える