public void Fail()
        {
            ITaskRuntimeInfo taskInfo = this.Repository.TaskRuntimeInfo.Add();

            ITask task = new FakeTask();

            this.Repository.Tasks.Add(taskInfo.TaskId, task);

            this.DateTimeProvider.UtcNow = DateTime.UtcNow;

            Exception error = new TypeNotFoundInRedisException("Dummy Error");

            using (FakeTaskWorker worker = new FakeTaskWorker())
            {
                worker.PredefineMethodCall(w => w.StartTask(task, null), () => { throw error; });

                this.TaskWorkerFactory.PredefineResult(worker, f => f.CreateTaskWorker(task));

                try
                {
                    this.TaskWorkerBootstrap.StartTask(taskInfo.TaskId);
                }
                catch (TypeNotFoundInRedisException)
                {
                }

                worker.AssertMethodCallOnce(w => w.Dispose());
            }

            this.MessageBus.Tasks.Receiver.AssertMethodCallOnce(mb => mb.UnsubscribeFromAllChannels());

            this.Repository.TaskRuntimeInfo.AssertMethodCallOnceWithArguments(r => r.Fail(taskInfo.TaskId, this.DateTimeProvider.UtcNow, error));
        }
        public void Fail()
        {
            ITaskRuntimeInfo taskInfo = this.Repository.Add();

            Guid taskProcessorId = Guid.NewGuid();

            DateTime timestampUtc = DateTime.UtcNow;

            Exception error = new TypeNotFoundInRedisException("Hello Error");

            this.Repository.Start(taskInfo.TaskId, taskProcessorId, DateTime.UtcNow.AddMinutes(-1));
            this.Repository.Fail(taskInfo.TaskId, timestampUtc, error);

            taskInfo = this.Repository.GetById(taskInfo.TaskId);

            Assert.AreEqual(TaskStatus.Failed, taskInfo.Status);

            this.AssertEqual(timestampUtc, taskInfo.CompletedUtc.Value);

            Assert.AreEqual(error.ToString(), taskInfo.Error);

            Assert.IsFalse(this.Repository.CheckIsPendingOrActive(taskInfo.TaskId));
            Assert.IsFalse(this.Repository.GetPending(false).Any(t => t.TaskId == taskInfo.TaskId));
            Assert.IsFalse(this.Repository.GetPending(true).Any(t => t.TaskId == taskInfo.TaskId));
            Assert.IsFalse(this.Repository.GetPendingAndActive()[TaskStatus.Pending].Any(t => t.TaskId == taskInfo.TaskId));
            Assert.IsFalse(this.Repository.GetPendingAndActive()[TaskStatus.InProgress].Any(t => t.TaskId == taskInfo.TaskId));
            Assert.IsFalse(this.Repository.GetActive().Any(t => t.TaskId == taskInfo.TaskId));
            Assert.IsTrue(this.Repository.GetFailed().Any(t => t.TaskId == taskInfo.TaskId));
            Assert.IsTrue(this.Repository.GetArchive().Any(t => t.TaskId == taskInfo.TaskId));
        }