diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js
index 01faeab660b57438d4415c75364bc29dd5689848..783cc05a7816deb841cdb91cdbd0228d068c76bf 100644
--- a/services/nuget/nuget-v3-service-family.js
+++ b/services/nuget/nuget-v3-service-family.js
@@ -76,7 +76,7 @@ async function fetch(
   serviceInstance,
   { baseUrl, packageName, includePrereleases = false }
 ) {
-  const json = await serviceInstance._requestJson({
+  return serviceInstance._requestJson({
     schema,
     url: await searchServiceUrl(baseUrl, 'SearchQueryService'),
     options: {
@@ -89,12 +89,6 @@ async function fetch(
       },
     },
   })
-
-  if (json.data.length === 1) {
-    return json.data[0]
-  } else {
-    throw new NotFound({ prettyMessage: 'package not found' })
-  }
 }
 
 /*
@@ -139,6 +133,21 @@ function createServiceFamily({
       return renderVersionBadge(props)
     }
 
+    /*
+     * Extract version information from the raw package info.
+     */
+    transform({ json, includePrereleases }) {
+      if (json.data.length === 1 && json.data[0].versions.length > 0) {
+        const { versions: packageVersions } = json.data[0]
+        const versions = packageVersions.map(item =>
+          stripBuildMetadata(item.version)
+        )
+        return selectVersion(versions, includePrereleases)
+      } else {
+        throw new NotFound({ prettyMessage: 'package not found' })
+      }
+    }
+
     async handle({ tenant, feed, which, packageName }) {
       const includePrereleases = which === 'vpre'
       const baseUrl = apiUrl({
@@ -149,9 +158,8 @@ function createServiceFamily({
         withFeed,
         feed,
       })
-      let { versions } = await fetch(this, { baseUrl, packageName })
-      versions = versions.map(item => stripBuildMetadata(item.version))
-      const version = selectVersion(versions, includePrereleases)
+      const json = await fetch(this, { baseUrl, packageName })
+      const version = this.transform({ json, includePrereleases })
       return this.constructor.render({ version, feed })
     }
   }
@@ -170,6 +178,20 @@ function createServiceFamily({
       return renderDownloadBadge(props)
     }
 
+    /*
+     * Extract download count from the raw package.
+     */
+    transform({ json }) {
+      if (json.data.length === 1) {
+        const packageInfo = json.data[0]
+        // Official NuGet server uses "totalDownloads" whereas MyGet uses
+        // "totaldownloads" (lowercase D). Ugh.
+        return packageInfo.totalDownloads || packageInfo.totaldownloads || 0
+      } else {
+        throw new NotFound({ prettyMessage: 'package not found' })
+      }
+    }
+
     async handle({ tenant, feed, which, packageName }) {
       const baseUrl = apiUrl({
         withTenant,
@@ -179,13 +201,8 @@ function createServiceFamily({
         withFeed,
         feed,
       })
-      const packageInfo = await fetch(this, { baseUrl, packageName })
-
-      // Official NuGet server uses "totalDownloads" whereas MyGet uses
-      // "totaldownloads" (lowercase D). Ugh.
-      const downloads =
-        packageInfo.totalDownloads || packageInfo.totaldownloads || 0
-
+      const json = await fetch(this, { baseUrl, packageName })
+      const downloads = this.transform({ json })
       return this.constructor.render({ downloads })
     }
   }
diff --git a/services/nuget/nuget-v3-service-family.spec.js b/services/nuget/nuget-v3-service-family.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..18b92dccd78992f30796e55028ca4bfffc775d15
--- /dev/null
+++ b/services/nuget/nuget-v3-service-family.spec.js
@@ -0,0 +1,91 @@
+'use strict'
+
+const { test, given } = require('sazerac')
+const { createServiceFamily } = require('./nuget-v3-service-family')
+
+const { NugetVersionService, NugetDownloadService } = createServiceFamily({
+  defaultLabel: 'nuget',
+  serviceBaseUrl: 'nuget',
+  apiBaseUrl: 'test',
+})
+
+function versionJson(versions) {
+  return {
+    data: [
+      {
+        versions: versions.map(v => ({
+          version: v,
+        })),
+      },
+    ],
+  }
+}
+
+function downloadsJson(payload) {
+  return {
+    data: [payload],
+  }
+}
+
+const noDataJson = { data: [] }
+const tooMuchDataJson = { data: [{}, {}] }
+
+describe('Nuget Version service', function () {
+  test(NugetVersionService.prototype.transform, () => {
+    given({ json: versionJson(['1.0.0']), includePrereleases: false }).expect(
+      '1.0.0'
+    )
+    given({
+      json: versionJson(['1.0.0', '1.0.1']),
+      includePrereleases: false,
+    }).expect('1.0.1')
+    given({
+      json: versionJson(['1.0.0', '1.0.1-beta1']),
+      includePrereleases: false,
+    }).expect('1.0.0')
+    given({
+      json: versionJson(['1.0.0', '1.0.1-beta1']),
+      includePrereleases: true,
+    }).expect('1.0.1-beta1')
+
+    given({
+      json: versionJson(['1.0.0+1', '1.0.1-beta1+1']),
+      includePrereleases: false,
+    }).expect('1.0.0')
+    given({
+      json: versionJson(['1.0.0+1', '1.0.1-beta1+1']),
+      includePrereleases: true,
+    }).expect('1.0.1-beta1')
+
+    given({ json: versionJson([]), includePrereleases: false }).expectError(
+      'Not Found: package not found'
+    )
+    given({ json: versionJson([]), includePrereleases: true }).expectError(
+      'Not Found: package not found'
+    )
+    given({ json: noDataJson, includePrereleases: false }).expectError(
+      'Not Found: package not found'
+    )
+    given({ json: noDataJson, includePrereleases: true }).expectError(
+      'Not Found: package not found'
+    )
+    given({ json: tooMuchDataJson, includePrereleases: false }).expectError(
+      'Not Found: package not found'
+    )
+    given({ json: tooMuchDataJson, includePrereleases: true }).expectError(
+      'Not Found: package not found'
+    )
+  })
+})
+
+describe('Nuget Download service', function () {
+  test(NugetDownloadService.prototype.transform, () => {
+    given({ json: downloadsJson({ totalDownloads: 10 }) }).expect(10)
+    given({ json: downloadsJson({ totaldownloads: 11 }) }).expect(11)
+    given({ json: downloadsJson({ other: 11 }) }).expect(0)
+    given({ json: downloadsJson({}) }).expect(0)
+
+    given({ json: noDataJson }).expectError('Not Found: package not found')
+    given({ json: tooMuchDataJson }).expectError('Not Found: package not found')
+  })
+})