Unit tests: to cast or not to cast?
You could make a strong argument that you need 2 tests.

General theory has a unit test (as opposed to an integration test) containing only one assert, see e.g. Programmers.StackExchange

So you probably want:

[Test]
public void Delete_WithValidBook_ReturnsRedirectToRouteResult()
{
    bookRepository.Add(someBook);
    var result = booksController.Delete(someBook.Id);
    Assert.That(result.Type, Is.EqualTo(typeof(RedirectToRouteResult)));
}

[Test]
public void Delete_WithValidBook_RedirectsToValidIndex()
{
    bookRepository.Add(someBook);
    var result = (RedirectToRouteResult)booksController.Delete(someBook.Id);
    Assert.That(result.RouteValues["Action"], Is.EqualTo("Index"));
}


This has the added advantage that it is much easier to find the bug later based on the name of the failed test alone.

For example, if your type test fails, presumably your redirect test will also fail, but I know which I'd look at first during debugging!

If, on the other hand, the Delete method is guaranteed (by the framework) to return a RedirectToRouteResult, then you only want one test:

[Test]
public void Delete_WithValidBook_RedirectsToValidIndex()
{
    bookRepository.Add(someBook);
    var result = (RedirectToRouteResult)booksController.Delete(someBook.Id);
    Assert.That(result.RouteValues["Action"], Is.EqualTo("Index"));
}


If you have multiple tests, or a guard assertion, the reader (i.e. you at some point in the future) will assume that it must be possible to get, say, a null result, which will mean you may feel the need to add null checks, etc, to other parts of the code that may not be required.