public void ExportManager_chains_exporter_to_packager() { // Arrange XUri dekiApiUri = new XUri("http://mock/@api/deki"); XDoc exportDocument = new XDoc("export"); XUri item1Uri = dekiApiUri.At("foo", "bar", "abc"); XDoc item1Doc = new XDoc("item1"); XUri item2Uri = dekiApiUri.At("foo", "bar", "def"); XDoc item2Doc = new XDoc("item2"); XDoc exportResponse = new XDoc("export") .Start("requests") .Start("request") .Attr("method", "GET") .Attr("dataid", "abc") .Attr("href", item1Uri) .Start("header").Attr("name", "h_1").Attr("value", "v_1").End() .Start("header").Attr("name", "h_2").Attr("value", "v_2").End() .End() .Start("request") .Attr("method", "GET") .Attr("dataid", "def") .Attr("href", item2Uri) .End() .End() .Start("manifest") .Start("foo").Attr("dataid", "abc").End() .Start("bar").Attr("dataid", "def").End() .End(); AutoMockPlug mock = MockPlug.Register(dekiApiUri); mock.Expect().Verb("POST").Uri(dekiApiUri.At("site", "export").With("relto", "0")).RequestDocument(exportDocument).Response(DreamMessage.Ok(exportResponse)); mock.Expect().Verb("GET").Uri(item1Uri).RequestHeader("h_1", "v_1").RequestHeader("h_2", "v_2").Response(DreamMessage.Ok(item1Doc)); mock.Expect().Verb("GET").Uri(item2Uri).Response(DreamMessage.Ok(item2Doc)); var writes = new List <string>(); var mockPackageWriter = new Mock <IPackageWriter>(); mockPackageWriter.Setup(x => x.WriteDataAsync(It.IsAny <ExportItem>(), It.IsAny <Result>())) .Returns(() => new Result().WithReturn()) .Callback((ExportItem item, Result result) => writes.Add(item.DataId)) .AtMost(2) .Verifiable(); mockPackageWriter.Setup(x => x.WriteManifest(It.IsAny <XDoc>(), It.IsAny <Result>())) .Returns(() => new Result().WithReturn()) .AtMostOnce() .Verifiable(); // Act ExportManager manager = ExportManager.CreateAsync(Plug.New(dekiApiUri), exportDocument, 0, mockPackageWriter.Object, new Result <ExportManager>()).Wait(); manager.ExportAsync(new Result()).Wait(); // Assert Assert.IsTrue(mock.WaitAndVerify(TimeSpan.FromSeconds(1)), mock.VerificationFailure); Assert.AreEqual(2, manager.TotalItems); Assert.AreEqual(2, manager.CompletedItems); Assert.AreEqual(new[] { "abc", "def" }, writes.ToArray()); mockPackageWriter.Verify(x => x.Dispose(), Times.Once()); mockPackageWriter.VerifyAll(); }