1

期待どおりに動作しない単純な Silverlight 単体テストがあります。

DataContext context = Mock.Create<DataContext>(Constructor.Mocked);

List<Resource> resources = new List<Resource>();

        Resource resource = new Resource
        {
            ContentType = "string",
            Data = Encoding.UTF8.GetBytes("Test")
        };


  Mock.Arrange(() => context.Resources.Add(resource)).DoInstead(() => resources.Add(resource));

 Mock.Arrange(() => context.Resources.SingleOrDefault()).Returns(resources.SingleOrDefault());


 context.Resources.Add(resource);

var loaded = context.Resources.SingleOrDefault();

リソース プロパティはローカル リソース (context.Resources.Add(resource)) リストに正しく追加されますが、読み戻そうとすると (context.Resources.SingleOrDefault()) 何も返されません。

4

2 に答える 2

3

の更新された値を返すにはresources.SingleOrDefault()、次のようにラムダ式を配置で使用する必要があります。

Mock.Arrange(() => context.Resources.SingleOrDefault())
    .Returns(() => resources.SingleOrDefault());

それ以外の場合、メソッドが呼び出されると、モックは配置時の呼び出しcontext.Resources.SingleOrDefault()の値である null を返します。resources.SingleOrDefault()

于 2013-11-27T12:16:05.363 に答える
3

.SingleOrDefault でスタブを行うべきではないと思います。これは .NET FW System.Lynq 拡張であり、十分にテストされています。十分にテストされているということは、このメソッドをスタブ化しても意味がないということです。あなたは常にそれが常に SingleOrDefault インスタンスを与えると仮定します。

Unit Test を使用すると、Resources によって返されるコレクション List をスタブ化できます。次に、SingleOrDefault にアクセスするだけです。以下のテストはパスします

    [TestMethod]
    public void YourReadableTestMethod()
    {
        var context = Mock.Create<DataContext>(Constructor.Mocked);
        context.Resources = new List<Resource>();
        var resources = new List<Resource>();

        var resource = new Resource {
            ContentType = "string",
            Data = Encoding.UTF8.GetBytes("Test")
        };
        resources.Add(resource);

        Mock.Arrange(() => context.Resources).ReturnsCollection(resources);


        context.Resources.Add(resource);

        var loaded = context.Resources.SingleOrDefault();
        Assert.IsNotNull(loaded);
    }   
于 2013-11-28T09:53:12.997 に答える